{ "cells": [ { "cell_type": "code", "execution_count": 237, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
sepal length in cmsepal width in cmpetal length in cmpetal width in cmclass
05.13.51.40.2Iris-setosa
14.93.01.40.2Iris-setosa
24.73.21.30.2Iris-setosa
34.63.11.50.2Iris-setosa
45.03.61.40.2Iris-setosa
\n", "
" ], "text/plain": [ " sepal length in cm sepal width in cm petal length in cm \\\n", "0 5.1 3.5 1.4 \n", "1 4.9 3.0 1.4 \n", "2 4.7 3.2 1.3 \n", "3 4.6 3.1 1.5 \n", "4 5.0 3.6 1.4 \n", "\n", " petal width in cm class \n", "0 0.2 Iris-setosa \n", "1 0.2 Iris-setosa \n", "2 0.2 Iris-setosa \n", "3 0.2 Iris-setosa \n", "4 0.2 Iris-setosa " ] }, "execution_count": 237, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Import library and data\n", "import pandas as pd\n", "import numpy as np\n", "import os\n", "import argparse\n", "import random\n", "import matplotlib.pyplot as plt\n", "import seaborn as sns\n", "%matplotlib inline\n", "from sklearn.neighbors import KNeighborsClassifier\n", "from sklearn.metrics import accuracy_score\n", "from sklearn.model_selection import train_test_split\n", "from collections import Counter\n", "import math\n", "import operator\n", "from scipy.spatial.distance import cosine\n", "import csv\n", "\n", "os.getcwd()\n", "data=pd.read_csv('C:/Users/mxm5116/Desktop/Data Mining/iris.csv')\n", "data.head()" ] }, { "cell_type": "code", "execution_count": 139, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 139, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYIAAAEICAYAAABS0fM3AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nO3deZgU9bXw8e9hGAVRUWF8Y8DLxGgiyDJs4wIKgqBxwSWguBNQjMmgxrhE87oRMSom16h5vFclikERght6XYhBVFDZN5lxRVSi73VEGZVFWc77R9UMTU/3VPV0VXV19/k8Tz81Xevp39T0mar6LaKqGGOMKV4tch2AMcaY3LJEYIwxRc4SgTHGFDlLBMYYU+QsERhjTJGzRGCMMUUu9EQgIiUislREnk2xbJSI1IrIMvd1QdjxGGOM2VnLCI5xKVAD7Jlm+TRVrfK7s/bt22t5eXkQcRljTNFYvHjxF6palmpZqIlARDoCJwATgMuD2Gd5eTmLFi0KYlfGGFM0ROSjdMvCvjV0J3AVsL2JdX4uIitEZIaI7B9yPMYYY5KElghE5ETgc1Vd3MRqzwDlqtodeAmYnGZfY0VkkYgsqq2tDSFaY4wpXmFeEfQDhonIGuAxYJCITElcQVXXqep37tv7gd6pdqSq96lqH1XtU1aW8haXMcaYZgrtGYGqXgNcAyAiA4ErVPWcxHVEZD9V/cx9OwznobIxJg9s2bKFtWvXsnnz5lyHYhK0atWKjh07Ulpa6nubKGoN7URExgOLVHUmcImIDAO2Al8Co6KOxxjTPGvXrmWPPfagvLwcEcl1OAZQVdatW8fatWv50Y9+5Hu7SBKBqs4B5rg/X58wv+GqwRiTXzZv3mxJIGZEhHbt2pHps1RrWWzyWm0tLFzoTE30LAnET3N+J5YITN6aOhU6dYIhQ5zp1Km5jsiY/GSJwOSl2loYMwY2bYK6Omc6ZoxdGRSb3XffPe2yI444IrTj3nLLLaHtOxcsEZi8tGYN7LLLzvNKS535prht27YNgNdffz20Y1giMCYGysvh++93nrdlizPfxFdYz3TmzJnD0UcfzVlnnUW3bt2AHVcLn332GUcddRQVFRV07dqV1157rdH2q1atorKykoqKCrp37857770HwJQpUxrmX3TRRWzbto3f/e53bNq0iYqKCs4++2wA/vznP9O1a1e6du3KnXfeCcCGDRs44YQT6NGjB127dmXatGkAjB8/nr59+9K1a1fGjh1LLMaNV9W8evXu3VuNUVV99FHV1q1V99zTmT76aK4jKi7V1dUZrV//+2rbNrjfV5s2bVRV9eWXX9bddttNV69e3WjZHXfcoTfffLOqqm7dulW//vrrRvupqqrSKVOmqKrqd999pxs3btTq6mo98cQT9fvvv1dV1YsvvlgnT568075VVRctWqRdu3bVb7/9Vr/55hvt0qWLLlmyRGfMmKEXXHBBw3rr169XVdV169Y1zDvnnHN05syZ2RdEklS/G5xq+ym/VyNvR2BMUM48E445xrkdVF4O1ug8vhKf6Wza5MwbM8b5/QX1e6usrExZd75v376MHj2aLVu2cMopp1BRUdFoncMPP5wJEyawdu1aTjvtNA466CD+9a9/sXjxYvr27QvApk2b2HfffRttO3fuXE499VTatGkDwGmnncZrr73GcccdxxVXXMHVV1/NiSeeyJFHHgnAyy+/zO23387GjRv58ssvOeSQQzjppJOCKYRmsltDJq+VlUHfvpYE4i6KZzr1X8TJjjrqKF599VU6dOjAueeey8MPP8yTTz5JRUUFFRUVLFq0iLPOOouZM2fSunVrjj32WGbPno2qcv7557Ns2TKWLVvGO++8w4033tho/5rm1s5PfvITFi9eTLdu3bjmmmsYP348mzdv5le/+hUzZsxg5cqVXHjhhbFomW2JwBgTulw+0/noo4/Yd999ufDCCxkzZgxLlizh1FNPbfiC79OnD6tXr+aAAw7gkksuYdiwYaxYsYLBgwczY8YMPv/8cwC+/PJLPvrI6cm5tLSULVu2AE6ieeqpp9i4cSMbNmzgySef5Mgjj+TTTz9lt91245xzzuGKK65gyZIlDV/67du359tvv2XGjBnhF4APdmvIGBO6sjKYNMm5HVRa6iSBSZOiuZKbM2cOEydOpLS0lN13352HH3640TrTpk1jypQplJaW8oMf/IDrr7+effbZh5tvvpmhQ4eyfft2SktL+etf/0qnTp0YO3Ys3bt3p1evXjzyyCOMGjWKyspKAC644AJ69uzJiy++yJVXXkmLFi0oLS3l3nvvZa+99uLCCy+kW7dulJeXN9x2yjVJd1kTV3369FEbmMaY3KupqaFz584ZbVNba890opDq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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Lets see the visualization of different class\n", "%matplotlib inline\n", "# Let see the sepal pattern\n", "ax = data[data['class'] == 'Iris-setosa'].plot.scatter(x='sepal length in cm', y='sepal width in cm', c='blue', label='Iris-setosa')\n", "ax = data[data['class'] == 'Iris-versicolor'].plot.scatter(x='sepal length in cm', y='sepal width in cm', c='orange', label='Iris-versicolor', ax=ax)\n", "ax = data[data['class'] == 'Iris-virginica'].plot.scatter(x='sepal length in cm', y='sepal width in cm', c='red', label='Iris-virginica', ax=ax)\n", "ax\n" ] }, { "cell_type": "code", "execution_count": 140, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 140, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Let see the petal pattern\n", "\n", "ax = data[data['class'] == 'Iris-setosa'].plot.scatter(x='petal length in cm', y='petal width in cm', c='blue', label='Iris-setosa')\n", "ax = data[data['class'] == 'Iris-versicolor'].plot.scatter(x='petal length in cm', y='petal width in cm', c='orange', label='Iris-versicolor', ax=ax)\n", "ax = data[data['class'] == 'Iris-virginica'].plot.scatter(x='petal length in cm', y='petal width in cm', c='red', label='Iris-virginica', ax=ax)\n", "ax" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# a.Divide the dataset as development and test. Because kNN does not require training you don’t have a train dataset. Make sure randomly divide the dataset \n" ] }, { "cell_type": "code", "execution_count": 141, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[6.3 2.7 4.9 1.8]\n", " [4.8 3.4 1.9 0.2]\n", " [5. 3. 1.6 0.2]\n", " [5.1 3.3 1.7 0.5]\n", " [5.6 2.7 4.2 1.3]\n", " [5.1 3.4 1.5 0.2]\n", " [5.7 3. 4.2 1.2]\n", " [7.7 3.8 6.7 2.2]\n", " [4.6 3.2 1.4 0.2]\n", " [6.2 2.9 4.3 1.3]\n", " [5.7 2.5 5. 2. ]\n", " [5.5 4.2 1.4 0.2]\n", " [6. 3. 4.8 1.8]\n", " [5.8 2.7 5.1 1.9]\n", " [6. 2.2 4. 1. ]\n", " [5.4 3. 4.5 1.5]\n", " [6.2 3.4 5.4 2.3]\n", " [5.5 2.3 4. 1.3]\n", " [5.4 3.9 1.7 0.4]\n", " [5. 2.3 3.3 1. ]\n", " [6.4 2.7 5.3 1.9]\n", " [5. 3.3 1.4 0.2]\n", " [5. 3.2 1.2 0.2]\n", " [5.5 2.4 3.8 1.1]\n", " [6.7 3. 5. 1.7]\n", " [4.9 3.1 1.5 0.1]\n", " [5.8 2.8 5.1 2.4]\n", " [5. 3.4 1.5 0.2]\n", " [5. 3.5 1.6 0.6]\n", " [5.9 3.2 4.8 1.8]\n", " [5.1 2.5 3. 1.1]\n", " [6.9 3.2 5.7 2.3]\n", " [6. 2.7 5.1 1.6]\n", " [6.1 2.6 5.6 1.4]\n", " [7.7 3. 6.1 2.3]\n", " [5.5 2.5 4. 1.3]\n", " [4.4 2.9 1.4 0.2]\n", " [4.3 3. 1.1 0.1]\n", " [6. 2.2 5. 1.5]\n", " [7.2 3.2 6. 1.8]\n", " [4.6 3.1 1.5 0.2]\n", " [5.1 3.5 1.4 0.3]\n", " [4.4 3. 1.3 0.2]\n", " [6.3 2.5 4.9 1.5]\n", " [6.3 3.4 5.6 2.4]\n", " [4.6 3.4 1.4 0.3]\n", " [6.8 3. 5.5 2.1]\n", " [6.3 3.3 6. 2.5]\n", " [4.7 3.2 1.3 0.2]\n", " [6.1 2.9 4.7 1.4]\n", " [6.5 2.8 4.6 1.5]\n", " [6.2 2.8 4.8 1.8]\n", " [7. 3.2 4.7 1.4]\n", " [6.4 3.2 5.3 2.3]\n", " [5.1 3.8 1.6 0.2]\n", " [6.9 3.1 5.4 2.1]\n", " [5.9 3. 4.2 1.5]\n", " [6.5 3. 5.2 2. ]\n", " [5.7 2.6 3.5 1. ]\n", " [5.2 2.7 3.9 1.4]\n", " [6.1 3. 4.6 1.4]\n", " [4.5 2.3 1.3 0.3]\n", " [6.6 2.9 4.6 1.3]\n", " [5.5 2.6 4.4 1.2]\n", " [5.3 3.7 1.5 0.2]\n", " [5.6 3. 4.1 1.3]\n", " [7.3 2.9 6.3 1.8]\n", " [6.7 3.3 5.7 2.1]\n", " [5.1 3.7 1.5 0.4]\n", " [4.9 2.4 3.3 1. ]\n", " [6.7 3.3 5.7 2.5]\n", " [7.2 3. 5.8 1.6]\n", " [4.9 3.1 1.5 0.1]\n", " [6.7 3.1 5.6 2.4]\n", " [4.9 3. 1.4 0.2]\n", " [6.9 3.1 4.9 1.5]\n", " [7.4 2.8 6.1 1.9]\n", " [6.3 2.9 5.6 1.8]\n", " [5.7 2.8 4.1 1.3]\n", " [6.5 3. 5.5 1.8]\n", " [6.3 2.3 4.4 1.3]\n", " [6.4 2.9 4.3 1.3]\n", " [5.6 2.8 4.9 2. ]\n", " [5.9 3. 5.1 1.8]\n", " [5.4 3.4 1.7 0.2]\n", " [6.1 2.8 4. 1.3]\n", " [4.9 2.5 4.5 1.7]\n", " [5.8 4. 1.2 0.2]\n", " [5.8 2.6 4. 1.2]\n", " [7.1 3. 5.9 2.1]]\n", "[[6.1 2.8 4.7 1.2]\n", " [5.7 3.8 1.7 0.3]\n", " [7.7 2.6 6.9 2.3]\n", " [6. 2.9 4.5 1.5]\n", " [6.8 2.8 4.8 1.4]\n", " [5.4 3.4 1.5 0.4]\n", " [5.6 2.9 3.6 1.3]\n", " [6.9 3.1 5.1 2.3]\n", " [6.2 2.2 4.5 1.5]\n", " [5.8 2.7 3.9 1.2]\n", " [6.5 3.2 5.1 2. ]\n", " [4.8 3. 1.4 0.1]\n", " [5.5 3.5 1.3 0.2]\n", " [4.9 3.1 1.5 0.1]\n", " [5.1 3.8 1.5 0.3]\n", " [6.3 3.3 4.7 1.6]\n", " [6.5 3. 5.8 2.2]\n", " [5.6 2.5 3.9 1.1]\n", " [5.7 2.8 4.5 1.3]\n", " [6.4 2.8 5.6 2.2]\n", " [4.7 3.2 1.6 0.2]\n", " [6.1 3. 4.9 1.8]\n", " [5. 3.4 1.6 0.4]\n", " [6.4 2.8 5.6 2.1]\n", " [7.9 3.8 6.4 2. ]\n", " [6.7 3. 5.2 2.3]\n", " [6.7 2.5 5.8 1.8]\n", " [6.8 3.2 5.9 2.3]\n", " [4.8 3. 1.4 0.3]\n", " [4.8 3.1 1.6 0.2]\n", " [4.6 3.6 1. 0.2]\n", " [5.7 4.4 1.5 0.4]\n", " [6.7 3.1 4.4 1.4]\n", " [4.8 3.4 1.6 0.2]\n", " [4.4 3.2 1.3 0.2]\n", " [6.3 2.5 5. 1.9]\n", " [6.4 3.2 4.5 1.5]\n", " [5.2 3.5 1.5 0.2]\n", " [5. 3.6 1.4 0.2]\n", " [5.2 4.1 1.5 0.1]\n", " [5.8 2.7 5.1 1.9]\n", " [6. 3.4 4.5 1.6]\n", " [6.7 3.1 4.7 1.5]\n", " [5.4 3.9 1.3 0.4]\n", " [5.4 3.7 1.5 0.2]\n", " [5.5 2.4 3.7 1. ]\n", " [6.3 2.8 5.1 1.5]\n", " [6.4 3.1 5.5 1.8]\n", " [6.6 3. 4.4 1.4]\n", " [7.2 3.6 6.1 2.5]\n", " [5.7 2.9 4.2 1.3]\n", " [7.6 3. 6.6 2.1]\n", " [5.6 3. 4.5 1.5]\n", " [5.1 3.5 1.4 0.2]\n", " [7.7 2.8 6.7 2. ]\n", " [5.8 2.7 4.1 1. ]\n", " [5.2 3.4 1.4 0.2]\n", " [5. 3.5 1.3 0.3]\n", " [5.1 3.8 1.9 0.4]\n", " [5. 2. 3.5 1. ]]\n", "['Iris-virginica' 'Iris-setosa' 'Iris-setosa' 'Iris-setosa'\n", " 'Iris-versicolor' 'Iris-setosa' 'Iris-versicolor' 'Iris-virginica'\n", " 'Iris-setosa' 'Iris-versicolor' 'Iris-virginica' 'Iris-setosa'\n", " 'Iris-virginica' 'Iris-virginica' 'Iris-versicolor' 'Iris-versicolor'\n", " 'Iris-virginica' 'Iris-versicolor' 'Iris-setosa' 'Iris-versicolor'\n", " 'Iris-virginica' 'Iris-setosa' 'Iris-setosa' 'Iris-versicolor'\n", " 'Iris-versicolor' 'Iris-setosa' 'Iris-virginica' 'Iris-setosa'\n", " 'Iris-setosa' 'Iris-versicolor' 'Iris-versicolor' 'Iris-virginica'\n", " 'Iris-versicolor' 'Iris-virginica' 'Iris-virginica' 'Iris-versicolor'\n", " 'Iris-setosa' 'Iris-setosa' 'Iris-virginica' 'Iris-virginica'\n", " 'Iris-setosa' 'Iris-setosa' 'Iris-setosa' 'Iris-versicolor'\n", " 'Iris-virginica' 'Iris-setosa' 'Iris-virginica' 'Iris-virginica'\n", " 'Iris-setosa' 'Iris-versicolor' 'Iris-versicolor' 'Iris-virginica'\n", " 'Iris-versicolor' 'Iris-virginica' 'Iris-setosa' 'Iris-virginica'\n", " 'Iris-versicolor' 'Iris-virginica' 'Iris-versicolor' 'Iris-versicolor'\n", " 'Iris-versicolor' 'Iris-setosa' 'Iris-versicolor' 'Iris-versicolor'\n", " 'Iris-setosa' 'Iris-versicolor' 'Iris-virginica' 'Iris-virginica'\n", " 'Iris-setosa' 'Iris-versicolor' 'Iris-virginica' 'Iris-virginica'\n", " 'Iris-setosa' 'Iris-virginica' 'Iris-setosa' 'Iris-versicolor'\n", " 'Iris-virginica' 'Iris-virginica' 'Iris-versicolor' 'Iris-virginica'\n", " 'Iris-versicolor' 'Iris-versicolor' 'Iris-virginica' 'Iris-virginica'\n", " 'Iris-setosa' 'Iris-versicolor' 'Iris-virginica' 'Iris-setosa'\n", " 'Iris-versicolor' 'Iris-virginica']\n", "['Iris-versicolor' 'Iris-setosa' 'Iris-virginica' 'Iris-versicolor'\n", " 'Iris-versicolor' 'Iris-setosa' 'Iris-versicolor' 'Iris-virginica'\n", " 'Iris-versicolor' 'Iris-versicolor' 'Iris-virginica' 'Iris-setosa'\n", " 'Iris-setosa' 'Iris-setosa' 'Iris-setosa' 'Iris-versicolor'\n", " 'Iris-virginica' 'Iris-versicolor' 'Iris-versicolor' 'Iris-virginica'\n", " 'Iris-setosa' 'Iris-virginica' 'Iris-setosa' 'Iris-virginica'\n", " 'Iris-virginica' 'Iris-virginica' 'Iris-virginica' 'Iris-virginica'\n", " 'Iris-setosa' 'Iris-setosa' 'Iris-setosa' 'Iris-setosa' 'Iris-versicolor'\n", " 'Iris-setosa' 'Iris-setosa' 'Iris-virginica' 'Iris-versicolor'\n", " 'Iris-setosa' 'Iris-setosa' 'Iris-setosa' 'Iris-virginica'\n", " 'Iris-versicolor' 'Iris-versicolor' 'Iris-setosa' 'Iris-setosa'\n", " 'Iris-versicolor' 'Iris-virginica' 'Iris-virginica' 'Iris-versicolor'\n", " 'Iris-virginica' 'Iris-versicolor' 'Iris-virginica' 'Iris-versicolor'\n", " 'Iris-setosa' 'Iris-virginica' 'Iris-versicolor' 'Iris-setosa'\n", " 'Iris-setosa' 'Iris-setosa' 'Iris-versicolor']\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "C:\\Users\\mxm5116\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\ipykernel_launcher.py:2: DeprecationWarning: \n", ".ix is deprecated. Please use\n", ".loc for label based indexing or\n", ".iloc for positional indexing\n", "\n", "See the documentation here:\n", "http://pandas.pydata.org/pandas-docs/stable/indexing.html#ix-indexer-is-deprecated\n", " \n" ] } ], "source": [ "# create design matrix X and target vector y\n", "X = np.array(data.ix[:, 0:4]) \n", "y = np.array(data['class']) \n", "\n", "Dev_data_X, \\\n", "test_data_X, \\\n", "Dev_data_y, \\\n", "test_data_y = train_test_split(X, y, test_size=0.40, random_state=42)\n", "print(Dev_data_X)\n", "print(test_data_X)\n", "print(Dev_data_y)\n", "print(test_data_y)" ] }, { "cell_type": "code", "execution_count": 142, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(90, 4)\n", "(60, 4)\n", "(90,)\n", "(60,)\n" ] } ], "source": [ "print(Dev_data_X.shape)\n", "print(test_data_X.shape)\n", "print(Dev_data_y.shape)\n", "print(test_data_y.shape)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# b.\timplement kNN using the following hyperparameters\n", "* number of neighbor K \n", " * 1,3,5,7\n", "* distance metric\n", "•\teuclidean distance\n", "•\tnormalized euclidean distance\n", "•\tcosine similarity\n", "\n", "\n", "# c. Using the development dataset,\n", "\n", " Calculate accuracy by iterating all of the development data point\n", " Find optimal hyperparameters\n", "\n", " * Draw bar charts for accuracy\n", " \n", " \n", "# d. Using the test dataset\n", "\n", " * Use the optimal hyperparameters you found in the step c, and use it to calculate the final accuracy. \n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Lets Find the best Hyperparameter for Iris data out of K=1,3,5,7,9,11,13,15,17,19,21" ] }, { "cell_type": "code", "execution_count": 143, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "C:\\Users\\mxm5116\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\model_selection\\_split.py:1978: FutureWarning: The default value of cv will change from 3 to 5 in version 0.22. Specify it explicitly to silence this warning.\n", " warnings.warn(CV_WARNING, FutureWarning)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Best Hyper Parameters:\n", " {'algorithm': 'auto', 'leaf_size': 1, 'n_jobs': -1, 'n_neighbors': 7, 'weights': 'distance'}\n", "Accuracy: 0.9833333333333333\n", "Confusion Metrix:\n", " [[23 0 0]\n", " [ 0 19 1]\n", " [ 0 0 17]]\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "C:\\Users\\mxm5116\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\model_selection\\_search.py:813: DeprecationWarning: The default of the `iid` parameter will change from True to False in version 0.22 and will be removed in 0.24. This will change numeric results when test-set sizes are unequal.\n", " DeprecationWarning)\n" ] } ], "source": [ "# Now lets Run KNN with a range of K value\n", "from sklearn.model_selection import GridSearchCV\n", "from sklearn.neighbors import KNeighborsClassifier\n", "from sklearn import metrics\n", "\n", "params = {'n_neighbors':[1,3,5,7,9,11,13,15,17,19,21],\n", " 'leaf_size':[1,2,3,5,10,15,20,30],\n", " 'weights':['uniform', 'distance'],\n", " 'algorithm':['auto', 'ball_tree','kd_tree','brute'],\n", " 'n_jobs':[-1]}\n", "Dev_model = KNeighborsClassifier(n_jobs=-1)\n", "KNN_model = GridSearchCV(Dev_model, param_grid=params, n_jobs=1)\n", "KNN_model.fit(Dev_data_X,Dev_data_y)\n", "print(\"Best Hyper Parameters:\\n\",KNN_model.best_params_)\n", "prediction=KNN_model.predict(test_data_X)\n", "print(\"Accuracy:\",metrics.accuracy_score(prediction,test_data_y))\n", "print(\"Confusion Metrix:\\n\",metrics.confusion_matrix(prediction,test_data_y))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# So,from above program it was found that best hyperparameter,K =7, Now we will apply K=7 in our euclidean distance KNN" ] }, { "cell_type": "code", "execution_count": 144, "metadata": {}, "outputs": [], "source": [ "# Now Apply euclidean distance in KNN step by step \n", "def train(Dev_data_X, Dev_data_y):\n", " return\n", "\n", "def predict(Dev_data_X, Dev_data_y, test_data_X, k):\n", " \n", "\n", " distances = []\n", " targets = []\n", "\n", " for i in range(len(Dev_data_X)):\n", " distances.append([np.sqrt(np.sum(np.square(test_data_X - Dev_data_X[i, :]))), i])\n", "\n", " distances = sorted(distances)\n", "\n", " # make a list of the k neighbors' targets\n", " for i in range(k):\n", " index = distances[i][1]\n", " targets.append(Dev_data_y[index])\n", "\n", " # return most common target\n", " return Counter(targets).most_common(1)[0][0]" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "def k_nearest_neighbor(Dev_data_X, Dev_data_y, test_data_X, k):\n", " # train on the develop data\n", " train(Dev_data_X, Dev_data_y)\n", "\n", " # loop over all observations\n", " predictions = []\n", " for i in range(len(test_data_X)):\n", " predictions.append(predict(Dev_data_X, Dev_data_y, test_data_X[i, :], k))\n", "\n", " return np.asarray(predictions)\n" ] }, { "cell_type": "code", "execution_count": 242, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " accuracy1 98.33333333333333\n", " accuracy3 98.33333333333333\n", " accuracy5 98.33333333333333\n", " accuracy7 98.33333333333333\n", " accuracy9 98.33333333333333\n", " accuracy11 100.0\n", " accuracy13 100.0\n" ] } ], "source": [ "# Now make the predictions when, k=1\n", "predictions = k_nearest_neighbor(Dev_data_X, Dev_data_y, test_data_X, 1)\n", "\n", "# Evaluate accuracy\n", "accuracy = accuracy_score(test_data_y, predictions)\n", "print(\" accuracy1 {}\".format(100*accuracy))\n", "\n", "# Now make the predictions when, k=3\n", "predictions = k_nearest_neighbor(Dev_data_X, Dev_data_y, test_data_X, 3)\n", "\n", "# Evaluate accuracy\n", "accuracy = accuracy_score(test_data_y, predictions)\n", "print(\" accuracy3 {}\".format(100*accuracy))\n", "\n", "# Now make the predictions when, k=5\n", "predictions = k_nearest_neighbor(Dev_data_X, Dev_data_y, test_data_X, 5)\n", "\n", "# Evaluate accuracy\n", "accuracy = accuracy_score(test_data_y, predictions)\n", "print(\" accuracy5 {}\".format(100*accuracy))\n", "\n", "# Now make the predictions when, k=7\n", "predictions = k_nearest_neighbor(Dev_data_X, Dev_data_y, test_data_X, 5)\n", "\n", "# Evaluate accuracy\n", "accuracy = accuracy_score(test_data_y, predictions)\n", "print(\" accuracy7 {}\".format(100*accuracy))\n", "\n", "# Now make the predictions when, k=9\n", "predictions = k_nearest_neighbor(Dev_data_X, Dev_data_y, test_data_X, 9)\n", "\n", "# Evaluate accuracy\n", "accuracy = accuracy_score(test_data_y, predictions)\n", "print(\" accuracy9 {}\".format(100*accuracy))\n", "\n", "# Now make the predictions when, k=11\n", "predictions = k_nearest_neighbor(Dev_data_X, Dev_data_y, test_data_X, 11)\n", "\n", "# Evaluate accuracy\n", "accuracy = accuracy_score(test_data_y, predictions)\n", "print(\" accuracy11 {}\".format(100*accuracy))\n", "\n", "# Now make the predictions when, k=13\n", "predictions = k_nearest_neighbor(Dev_data_X, Dev_data_y, test_data_X, 13)\n", "\n", "# Evaluate accuracy\n", "accuracy = accuracy_score(test_data_y, predictions)\n", "print(\" accuracy13 {}\".format(100*accuracy))" ] }, { "cell_type": "code", "execution_count": 207, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjsAAAGxCAYAAACEFXd4AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nO3de3yP9f/H8efHTmbfWWx2CrPkGCVE+MYwcwwpkpCodMKiFPVjHWxFllN8U8yp4ltRX31zmMOUUGhyCvmGOc1y2pjZ2K7fH7v55GOOn107XT3ut9t1u/V5X+/rul7Xe/PZs/d1fa6PzTAMQwAAABZVqqgLAAAAKEiEHQAAYGmEHQAAYGmEHQAAYGmEHQAAYGmEHQAAYGmEHQAAYGmEHQAAYGmEHQAAYGmEHSAfZs2aJZvNZl9cXV1VsWJFPfnkkzp8+LDpx0tMTFSLFi3k4+Mjm82mCRMmmH4M3JjNZlNUVJT99c6dOxUVFaX9+/fn6RsWFqY6deo4fawqVaqoU6dOedo/+eQTubi4qHPnzjp//rzT+79V/fr1U5UqVQrteIAZXIu6AMAK4uLiVLNmTWVkZOj7779XTEyM1qxZo23btsnLy8u04/Tv31/p6emaP3++ypUrxx+dIrJ+/XpVrFjR/nrnzp168803FRYWVig/k3Hjxmn48OHq06ePZs6cKVdX3sqB6+FfCGCCOnXqqGHDhpKkli1bKjs7W2+//ba+/vprPf744/nad3Z2ti5evCgPDw9t375dTz/9tNq3b29G2bpw4YJ9Rgo37/777y+yY48cOVIxMTEaNGiQJk6cKJvNVmS1ACUFl7GAAnDpj+GBAwfsbcnJyRo4cKAqVqwod3d3hYaG6s0339TFixftffbv3y+bzaaxY8fqnXfeUWhoqDw8PBQXFyebzaaLFy9q2rRp9stml2zfvl1dunRRuXLlVLp0adWrV0+zZ892qCkhIUE2m01z587VsGHDdPvtt8vDw0N79+61X45btWqVnn76afn6+qps2bLq27ev0tPTlZycrB49eui2225TUFCQXn75ZV24cMFh/2+++aYaN26s8uXLq2zZsqpfv75mzJihK79r+NJlmaVLl6p+/fry9PRUzZo1NXPmzDzjePjwYT3zzDOqVKmS3N3dFRwcrEceeUTHjh2z90lLS9PLL7+s0NBQubu76/bbb1dkZKTS09Ov+zP68MMPVapUKaWkpNjbxo8fL5vNphdeeMHelpOTo3LlymnYsGH2tssvY82aNUvdu3eXlBt0L/1sZs2a5XC8jRs36oEHHlCZMmV0xx136N1331VOTs51a7xcTk6OnnvuOcXExGjUqFGaNGnSDYNO165dFRISctXjNG7cWPXr13cYj+bNm8vf319eXl6qW7euxo4dm+fnfKVLv7NXnq+U93KfJP3+++/q1auX/P395eHhoVq1aunDDz+87jGA/OJ/54ACsHfvXklShQoVJOUGnUaNGqlUqVIaNWqUqlatqvXr1+udd97R/v37FRcX57D9pEmTVL16db3//vsqW7asbrvtNq1fv15NmjTRI4884vCHd/fu3WratKn8/f01adIk+fr6at68eerXr5+OHTum4cOHO+x7xIgRatKkif71r3+pVKlS8vf3t6976qmn1K1bN82fP1+JiYkaOXKkLl68qN27d6tbt2565plntGLFCr333nsKDg7W0KFD7dvu379fAwcOVOXKlSVJGzZs0KBBg3T48GGNGjXKoYZff/1Vw4YN02uvvaaAgAB98sknGjBggO688041b95cUm7Que+++3ThwgWNHDlSd999t06cOKFly5bp1KlTCggI0Llz59SiRQsdOnTI3mfHjh0aNWqUtm3bphUrVlwzEISHh8swDK1cuVKPPfaYJGnFihXy9PRUfHy8vd+mTZt0+vRphYeHX3U/HTt2VHR0tEaOHKkPP/zQHiCqVq1q75OcnKzHH39cw4YN0+jRo7Vo0SKNGDFCwcHB6tu371X3e7kLFy7o8ccf14IFCzRx4kQNHjz4httIuZc9u3TpolWrVjnUv2vXLv3888+aNGmSve1///ufevXqZQ+Nv/76q8aMGaNdu3ZdNYg6Y+fOnWratKkqV66s8ePHKzAwUMuWLdPgwYN1/PhxjR492pTjAHkYAJwWFxdnSDI2bNhgXLhwwThz5ozx7bffGhUqVDC8vb2N5ORkwzAMY+DAgcY//vEP48CBAw7bv//++4YkY8eOHYZhGMa+ffsMSUbVqlWNrKysPMeTZLzwwgsObT179jQ8PDyMpKQkh/b27dsbZcqUMU6fPm0YhmGsXr3akGQ0b978mucxaNAgh/auXbsakozY2FiH9nr16hn169e/5rhkZ2cbFy5cMN566y3D19fXyMnJsa8LCQkxSpcu7TAWGRkZRvny5Y2BAwfa2/r372+4ubkZO3fuvOZxYmJijFKlShkbN250aP/yyy8NScZ33313zW0NwzAqVqxo9O/f3zAMw8jMzDS8vLyMV1991ZBkr2/MmDGGm5ubcfbsWft2kozRo0fbX3/xxReGJGP16tV5jtGiRQtDkvHTTz85tNeuXdto27btdeszjNzxkmRIMkaOHHnD/pe7cOGCERAQYPTq1cuhffjw4Ya7u7tx/Pjxq2536ec3Z84cw8XFxTh58qR93RNPPGGEhITYX1/6nY2Li8uznyvHqW3btkbFihWN1NRUh34vvviiUbp0aYfjAGbiMhZggvvvv19ubm7y9vZWp06dFBgYqCVLliggIECS9O2336ply5YKDg7WxYsX7cule2/WrFnjsL/OnTvLzc3tpo69atUqtW7dWpUqVXJo79evn86dO6f169c7tD/88MPX3NeVn/qpVauWpNzZiyvbL79Ed6mO8PBw+fj4yMXFRW5ubho1apROnDjhcKlIkurVq2efAZKk0qVLq3r16g77XLJkiVq2bGmv4Wq+/fZb1alTR/Xq1XMY17Zt28pmsykhIeGa20pS69attWLFCknSunXrdO7cOQ0dOlR+fn722Z0VK1aoSZMm+brRPDAwUI0aNXJou/vuu/OM4bVcGq8pU6Zow4YNN31cV1dX9e7dWwsXLlRqaqqk3HvA5s6dqy5dusjX19feNzExUZ07d5avr6/959e3b19lZ2drz549N33Mazl//rxWrlyphx56SGXKlHH4eXXo0EHnz5+/pXMDbgVhBzDBnDlztHHjRiUmJurIkSPaunWrmjVrZl9/7NgxLV68WG5ubg7LXXfdJUk6fvy4w/6CgoJu+tgnTpy4av/g4GD7+pvdd/ny5R1eu7u7X7P98o87//zzz4qIiJAkffzxx/rxxx+1ceNGvf7665KkjIwMh+0v/yN7iYeHh0O/P//80+ETT1dz7Ngxbd26Nc+4ent7yzCMPON6pfDwcCUlJen333/XihUrdO+998rf31+tWrXSihUrlJGRoXXr1l3zEtbNupnzvZ7bb79dCQkJKleunNq2bZsnwF5P//79df78ec2fP1+StGzZMh09elRPPvmkvU9SUpIeeOABHT58WBMnTtQPP/ygjRs32u+ludk6r+fEiRO6ePGi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U05OjsaNG6eWLVuaVhwAAEB+OXUZa9y4cQoLC9OmTZuUlZWl4cOHa8eOHTp58qR+/PFHs2sEAABwmlMzO7Vr19bWrVvVqFEjtWnTRunp6erWrZsSExNVtWpVs2sEAABwmlMzO5IUGBioN99808xaAAAATOfUzE5cXJy++OKLPO1ffPGFZs+ene+iAAAAzOJU2Hn33Xfl5+eXp93f31/R0dH5Lupyhw8fVu/eveXr66syZcqoXr162rx5s329YRiKiopScHCwPD09FRYWph07dphaAwAAKLmcCjsHDhxQaGhonvaQkBAlJSXlu6hLTp06pWbNmsnNzU1LlizRzp07NX78eN122232PmPHjlVsbKymTJmijRs3KjAwUG3atNGZM2dMqwMAAJRcTt2z4+/vr61bt6pKlSoO7b/++qt8fX3NqEuS9N5776lSpUqKi4uzt11+TMMwNGHCBL3++uvq1q2bJGn27NkKCAjQZ599poEDB5pWCwAAKJmcmtnp2bOnBg8erNWrVys7O1vZ2dlatWqVhgwZop49e5pW3H/+8x81bNhQ3bt3l7+/v+699159/PHH9vX79u1TcnKyIiIi7G0eHh5q0aKF1q1bd839ZmZmKi0tzWEBAADW5FTYeeedd9S4cWO1bt1anp6e8vT0VEREhFq1amXqPTt//PGHpk2bpmrVqmnZsmV69tlnNXjwYPsDDZOTkyVJAQEBDtsFBATY111NTEyMfHx87EulSpVMqxkAABQvTl3Gcnd314IFC/T222/r119/laenp+rWrauQkBBTi8vJyVHDhg3tAeree+/Vjh07NG3aNPXt29fez2azOWxnGEaetsuNGDFCQ4cOtb9OS0sj8AAAYFFOP2dHkqpXr67q1aubVUseQUFBql27tkNbrVq19NVXX0nKfdaPlDvDExQUZO+TkpKSZ7bnch4eHnyHFwAAfxNOhZ3s7GzNmjVLK1euVEpKinJychzWr1q1ypTimjVrpt27dzu07dmzxz6DFBoaqsDAQMXHx+vee++VJGVlZWnNmjV67733TKkBAACUbE6FnSFDhmjWrFnq2LGj6tSpc91LRvnx0ksvqWnTpoqOjlaPHj30888/a/r06Zo+fbqk3MtXkZGRio6OVrVq1VStWjVFR0erTJky6tWrV4HUBAAAShanws78+fP173//Wx06dDC7Hgf33Xef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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt; plt.rcdefaults()\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "objects=('k=1','k=3','k=5','k=7','k=9','k=11','k=13')\n", "y_pos = np.arange(len(objects))\n", "performance = [98.33,98.33,98.33,98.33,98.33,100.0,100.0]\n", "plt.bar(y_pos, performance, align='center', alpha=0.5,color='green')\n", "plt.xticks(y_pos, objects)\n", "plt.ylabel('Performance')\n", "plt.title('Performance with K value')\n", "plt.show()\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# So at the starting, we have seen that K=7 is best hyperparameter. Now from the above manual coding, we have found that upto k=9, the accuracy is same for euclidean distance. So we will take k=7" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Now use normalized euclidean distance \n" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[0.64102564 0.43589744 0.16666667 0.01282051]\n", " [0.61538462 0.37179487 0.16666667 0.01282051]\n", " [0.58974359 0.3974359 0.15384615 0.01282051]\n", " [0.57692308 0.38461538 0.17948718 0.01282051]\n", " [0.62820513 0.44871795 0.16666667 0.01282051]\n", " [0.67948718 0.48717949 0.20512821 0.03846154]\n", " [0.57692308 0.42307692 0.16666667 0.02564103]\n", " [0.62820513 0.42307692 0.17948718 0.01282051]\n", " [0.55128205 0.35897436 0.16666667 0.01282051]\n", " [0.61538462 0.38461538 0.17948718 0. ]\n", " [0.67948718 0.46153846 0.17948718 0.01282051]\n", " [0.6025641 0.42307692 0.19230769 0.01282051]\n", " [0.6025641 0.37179487 0.16666667 0. ]\n", " [0.53846154 0.37179487 0.12820513 0. ]\n", " [0.73076923 0.5 0.14102564 0.01282051]\n", " [0.71794872 0.55128205 0.17948718 0.03846154]\n", " [0.67948718 0.48717949 0.15384615 0.03846154]\n", " [0.64102564 0.43589744 0.16666667 0.02564103]\n", " [0.71794872 0.47435897 0.20512821 0.02564103]\n", " [0.64102564 0.47435897 0.17948718 0.02564103]\n", " [0.67948718 0.42307692 0.20512821 0.01282051]\n", " [0.64102564 0.46153846 0.17948718 0.03846154]\n", " [0.57692308 0.44871795 0.11538462 0.01282051]\n", " [0.64102564 0.41025641 0.20512821 0.05128205]\n", " [0.6025641 0.42307692 0.23076923 0.01282051]\n", " [0.62820513 0.37179487 0.19230769 0.01282051]\n", " [0.62820513 0.42307692 0.19230769 0.03846154]\n", " [0.65384615 0.43589744 0.17948718 0.01282051]\n", " [0.65384615 0.42307692 0.16666667 0.01282051]\n", " [0.58974359 0.3974359 0.19230769 0.01282051]\n", " [0.6025641 0.38461538 0.19230769 0.01282051]\n", " [0.67948718 0.42307692 0.17948718 0.03846154]\n", " [0.65384615 0.51282051 0.17948718 0. ]\n", " [0.69230769 0.52564103 0.16666667 0.01282051]\n", " [0.61538462 0.38461538 0.17948718 0. ]\n", " [0.62820513 0.3974359 0.14102564 0.01282051]\n", " [0.69230769 0.43589744 0.15384615 0.01282051]\n", " [0.61538462 0.38461538 0.17948718 0. ]\n", " [0.55128205 0.37179487 0.15384615 0.01282051]\n", " [0.64102564 0.42307692 0.17948718 0.01282051]\n", " [0.62820513 0.43589744 0.15384615 0.02564103]\n", " [0.56410256 0.28205128 0.15384615 0.02564103]\n", " [0.55128205 0.3974359 0.15384615 0.01282051]\n", " [0.62820513 0.43589744 0.19230769 0.06410256]\n", " [0.64102564 0.47435897 0.23076923 0.03846154]\n", " [0.6025641 0.37179487 0.16666667 0.02564103]\n", " [0.64102564 0.47435897 0.19230769 0.01282051]\n", " [0.57692308 0.3974359 0.16666667 0.01282051]\n", " [0.66666667 0.46153846 0.17948718 0.01282051]\n", " [0.62820513 0.41025641 0.16666667 0.01282051]\n", " [0.88461538 0.3974359 0.58974359 0.16666667]\n", " [0.80769231 0.3974359 0.56410256 0.17948718]\n", " [0.87179487 0.38461538 0.61538462 0.17948718]\n", " [0.69230769 0.28205128 0.5 0.15384615]\n", " [0.82051282 0.34615385 0.57692308 0.17948718]\n", " [0.71794872 0.34615385 0.56410256 0.15384615]\n", " [0.79487179 0.41025641 0.58974359 0.19230769]\n", " [0.61538462 0.29487179 0.41025641 0.11538462]\n", " [0.83333333 0.35897436 0.57692308 0.15384615]\n", " [0.65384615 0.33333333 0.48717949 0.16666667]\n", " [0.62820513 0.24358974 0.43589744 0.11538462]\n", " [0.74358974 0.37179487 0.52564103 0.17948718]\n", " [0.75641026 0.26923077 0.5 0.11538462]\n", " [0.76923077 0.35897436 0.58974359 0.16666667]\n", " [0.70512821 0.35897436 0.44871795 0.15384615]\n", " [0.84615385 0.38461538 0.55128205 0.16666667]\n", " [0.70512821 0.37179487 0.56410256 0.17948718]\n", " [0.73076923 0.33333333 0.51282051 0.11538462]\n", " [0.78205128 0.26923077 0.56410256 0.17948718]\n", " [0.70512821 0.30769231 0.48717949 0.12820513]\n", " [0.74358974 0.3974359 0.6025641 0.21794872]\n", " [0.76923077 0.34615385 0.5 0.15384615]\n", " [0.79487179 0.30769231 0.61538462 0.17948718]\n", " [0.76923077 0.34615385 0.58974359 0.14102564]\n", " [0.80769231 0.35897436 0.53846154 0.15384615]\n", " [0.83333333 0.37179487 0.55128205 0.16666667]\n", " [0.85897436 0.34615385 0.6025641 0.16666667]\n", " [0.84615385 0.37179487 0.62820513 0.20512821]\n", " [0.75641026 0.35897436 0.56410256 0.17948718]\n", " [0.71794872 0.32051282 0.43589744 0.11538462]\n", " [0.69230769 0.29487179 0.47435897 0.12820513]\n", " [0.69230769 0.29487179 0.46153846 0.11538462]\n", " [0.73076923 0.33333333 0.48717949 0.14102564]\n", " [0.75641026 0.33333333 0.64102564 0.19230769]\n", " [0.67948718 0.37179487 0.56410256 0.17948718]\n", " [0.75641026 0.42307692 0.56410256 0.19230769]\n", " [0.84615385 0.38461538 0.58974359 0.17948718]\n", " [0.79487179 0.28205128 0.55128205 0.15384615]\n", " [0.70512821 0.37179487 0.51282051 0.15384615]\n", " [0.69230769 0.30769231 0.5 0.15384615]\n", " [0.69230769 0.32051282 0.55128205 0.14102564]\n", " [0.76923077 0.37179487 0.57692308 0.16666667]\n", " [0.73076923 0.32051282 0.5 0.14102564]\n", " [0.62820513 0.28205128 0.41025641 0.11538462]\n", " [0.70512821 0.33333333 0.52564103 0.15384615]\n", " [0.71794872 0.37179487 0.52564103 0.14102564]\n", " [0.71794872 0.35897436 0.52564103 0.15384615]\n", " [0.78205128 0.35897436 0.53846154 0.15384615]\n", " [0.64102564 0.30769231 0.37179487 0.12820513]\n", " [0.71794872 0.34615385 0.51282051 0.15384615]\n", " [0.79487179 0.41025641 0.75641026 0.30769231]\n", " [0.73076923 0.33333333 0.64102564 0.23076923]\n", " [0.8974359 0.37179487 0.74358974 0.25641026]\n", " [0.79487179 0.35897436 0.70512821 0.21794872]\n", " [0.82051282 0.37179487 0.73076923 0.26923077]\n", " [0.96153846 0.37179487 0.83333333 0.25641026]\n", " [0.61538462 0.30769231 0.56410256 0.20512821]\n", " [0.92307692 0.35897436 0.79487179 0.21794872]\n", " [0.84615385 0.30769231 0.73076923 0.21794872]\n", " [0.91025641 0.44871795 0.76923077 0.30769231]\n", " [0.82051282 0.3974359 0.64102564 0.24358974]\n", " [0.80769231 0.33333333 0.66666667 0.23076923]\n", " [0.85897436 0.37179487 0.69230769 0.25641026]\n", " [0.71794872 0.30769231 0.62820513 0.24358974]\n", " [0.73076923 0.34615385 0.64102564 0.29487179]\n", " [0.80769231 0.3974359 0.66666667 0.28205128]\n", " [0.82051282 0.37179487 0.69230769 0.21794872]\n", " [0.97435897 0.47435897 0.84615385 0.26923077]\n", " [0.97435897 0.32051282 0.87179487 0.28205128]\n", " [0.75641026 0.26923077 0.62820513 0.17948718]\n", " [0.87179487 0.3974359 0.71794872 0.28205128]\n", " [0.70512821 0.34615385 0.61538462 0.24358974]\n", " [0.97435897 0.34615385 0.84615385 0.24358974]\n", " [0.79487179 0.33333333 0.61538462 0.21794872]\n", " [0.84615385 0.41025641 0.71794872 0.25641026]\n", " [0.91025641 0.3974359 0.75641026 0.21794872]\n", " [0.78205128 0.34615385 0.6025641 0.21794872]\n", " [0.76923077 0.37179487 0.61538462 0.21794872]\n", " [0.80769231 0.34615385 0.70512821 0.25641026]\n", " [0.91025641 0.37179487 0.73076923 0.19230769]\n", " [0.93589744 0.34615385 0.76923077 0.23076923]\n", " [1. 0.47435897 0.80769231 0.24358974]\n", " [0.80769231 0.34615385 0.70512821 0.26923077]\n", " [0.79487179 0.34615385 0.64102564 0.17948718]\n", " [0.76923077 0.32051282 0.70512821 0.16666667]\n", " [0.97435897 0.37179487 0.76923077 0.28205128]\n", " [0.79487179 0.42307692 0.70512821 0.29487179]\n", " [0.80769231 0.38461538 0.69230769 0.21794872]\n", " [0.75641026 0.37179487 0.6025641 0.21794872]\n", " [0.87179487 0.38461538 0.67948718 0.25641026]\n", " [0.84615385 0.38461538 0.70512821 0.29487179]\n", " [0.87179487 0.38461538 0.64102564 0.28205128]\n", " [0.73076923 0.33333333 0.64102564 0.23076923]\n", " [0.85897436 0.3974359 0.74358974 0.28205128]\n", " [0.84615385 0.41025641 0.71794872 0.30769231]\n", " [0.84615385 0.37179487 0.65384615 0.28205128]\n", " [0.79487179 0.30769231 0.62820513 0.23076923]\n", " [0.82051282 0.37179487 0.65384615 0.24358974]\n", " [0.78205128 0.42307692 0.67948718 0.28205128]\n", " [0.74358974 0.37179487 0.64102564 0.21794872]]\n" ] } ], "source": [ "# normalizing the data\n", "normalize = (X - X.min()) / (X.max() - X.min())\n", "print(normalize)\n", "\n", "Dev_norm_data_X, \\\n", "test_norm_data_X, \\\n", "Dev_norm_data_y, \\\n", "test_norm_data_y = train_test_split(normalize, y, test_size=0.40, random_state=42)\n" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[0.79487179 0.33333333 0.61538462 0.21794872]\n", " [0.6025641 0.42307692 0.23076923 0.01282051]\n", " [0.62820513 0.37179487 0.19230769 0.01282051]\n", " [0.64102564 0.41025641 0.20512821 0.05128205]\n", " [0.70512821 0.33333333 0.52564103 0.15384615]\n", " [0.64102564 0.42307692 0.17948718 0.01282051]\n", " [0.71794872 0.37179487 0.52564103 0.14102564]\n", " [0.97435897 0.47435897 0.84615385 0.26923077]\n", " [0.57692308 0.3974359 0.16666667 0.01282051]\n", " [0.78205128 0.35897436 0.53846154 0.15384615]\n", " [0.71794872 0.30769231 0.62820513 0.24358974]\n", " [0.69230769 0.52564103 0.16666667 0.01282051]\n", " [0.75641026 0.37179487 0.6025641 0.21794872]\n", " [0.73076923 0.33333333 0.64102564 0.23076923]\n", " [0.75641026 0.26923077 0.5 0.11538462]\n", " [0.67948718 0.37179487 0.56410256 0.17948718]\n", " [0.78205128 0.42307692 0.67948718 0.28205128]\n", " [0.69230769 0.28205128 0.5 0.15384615]\n", " [0.67948718 0.48717949 0.20512821 0.03846154]\n", " [0.62820513 0.28205128 0.41025641 0.11538462]\n", " [0.80769231 0.33333333 0.66666667 0.23076923]\n", " [0.62820513 0.41025641 0.16666667 0.01282051]\n", " [0.62820513 0.3974359 0.14102564 0.01282051]\n", " [0.69230769 0.29487179 0.47435897 0.12820513]\n", " [0.84615385 0.37179487 0.62820513 0.20512821]\n", " [0.61538462 0.38461538 0.17948718 0. ]\n", " [0.73076923 0.34615385 0.64102564 0.29487179]\n", " [0.62820513 0.42307692 0.17948718 0.01282051]\n", " [0.62820513 0.43589744 0.19230769 0.06410256]\n", " [0.74358974 0.3974359 0.6025641 0.21794872]\n", " [0.64102564 0.30769231 0.37179487 0.12820513]\n", " [0.87179487 0.3974359 0.71794872 0.28205128]\n", " [0.75641026 0.33333333 0.64102564 0.19230769]\n", " [0.76923077 0.32051282 0.70512821 0.16666667]\n", " [0.97435897 0.37179487 0.76923077 0.28205128]\n", " [0.69230769 0.30769231 0.5 0.15384615]\n", " [0.55128205 0.35897436 0.16666667 0.01282051]\n", " [0.53846154 0.37179487 0.12820513 0. ]\n", " [0.75641026 0.26923077 0.62820513 0.17948718]\n", " [0.91025641 0.3974359 0.75641026 0.21794872]\n", " [0.57692308 0.38461538 0.17948718 0.01282051]\n", " [0.64102564 0.43589744 0.16666667 0.02564103]\n", " [0.55128205 0.37179487 0.15384615 0.01282051]\n", " [0.79487179 0.30769231 0.61538462 0.17948718]\n", " [0.79487179 0.42307692 0.70512821 0.29487179]\n", " [0.57692308 0.42307692 0.16666667 0.02564103]\n", " [0.85897436 0.37179487 0.69230769 0.25641026]\n", " [0.79487179 0.41025641 0.75641026 0.30769231]\n", " [0.58974359 0.3974359 0.15384615 0.01282051]\n", " [0.76923077 0.35897436 0.58974359 0.16666667]\n", " [0.82051282 0.34615385 0.57692308 0.17948718]\n", " [0.78205128 0.34615385 0.6025641 0.21794872]\n", " [0.88461538 0.3974359 0.58974359 0.16666667]\n", " [0.80769231 0.3974359 0.66666667 0.28205128]\n", " [0.64102564 0.47435897 0.19230769 0.01282051]\n", " [0.87179487 0.38461538 0.67948718 0.25641026]\n", " [0.74358974 0.37179487 0.52564103 0.17948718]\n", " [0.82051282 0.37179487 0.65384615 0.24358974]\n", " [0.71794872 0.32051282 0.43589744 0.11538462]\n", " [0.65384615 0.33333333 0.48717949 0.16666667]\n", " [0.76923077 0.37179487 0.57692308 0.16666667]\n", " [0.56410256 0.28205128 0.15384615 0.02564103]\n", " [0.83333333 0.35897436 0.57692308 0.15384615]\n", " [0.69230769 0.32051282 0.55128205 0.14102564]\n", " [0.66666667 0.46153846 0.17948718 0.01282051]\n", " [0.70512821 0.37179487 0.51282051 0.15384615]\n", " [0.92307692 0.35897436 0.79487179 0.21794872]\n", " [0.84615385 0.41025641 0.71794872 0.25641026]\n", " [0.64102564 0.46153846 0.17948718 0.03846154]\n", " [0.61538462 0.29487179 0.41025641 0.11538462]\n", " [0.84615385 0.41025641 0.71794872 0.30769231]\n", " [0.91025641 0.37179487 0.73076923 0.19230769]\n", " [0.61538462 0.38461538 0.17948718 0. ]\n", " [0.84615385 0.38461538 0.70512821 0.29487179]\n", " [0.61538462 0.37179487 0.16666667 0.01282051]\n", " [0.87179487 0.38461538 0.61538462 0.17948718]\n", " [0.93589744 0.34615385 0.76923077 0.23076923]\n", " [0.79487179 0.35897436 0.70512821 0.21794872]\n", " [0.71794872 0.34615385 0.51282051 0.15384615]\n", " [0.82051282 0.37179487 0.69230769 0.21794872]\n", " [0.79487179 0.28205128 0.55128205 0.15384615]\n", " [0.80769231 0.35897436 0.53846154 0.15384615]\n", " [0.70512821 0.34615385 0.61538462 0.24358974]\n", " [0.74358974 0.37179487 0.64102564 0.21794872]\n", " [0.67948718 0.42307692 0.20512821 0.01282051]\n", " [0.76923077 0.34615385 0.5 0.15384615]\n", " [0.61538462 0.30769231 0.56410256 0.20512821]\n", " [0.73076923 0.5 0.14102564 0.01282051]\n", " [0.73076923 0.32051282 0.5 0.14102564]\n", " [0.8974359 0.37179487 0.74358974 0.25641026]]\n", "[[0.76923077 0.34615385 0.58974359 0.14102564]\n", " [0.71794872 0.47435897 0.20512821 0.02564103]\n", " [0.97435897 0.32051282 0.87179487 0.28205128]\n", " [0.75641026 0.35897436 0.56410256 0.17948718]\n", " [0.85897436 0.34615385 0.6025641 0.16666667]\n", " [0.67948718 0.42307692 0.17948718 0.03846154]\n", " [0.70512821 0.35897436 0.44871795 0.15384615]\n", " [0.87179487 0.38461538 0.64102564 0.28205128]\n", " [0.78205128 0.26923077 0.56410256 0.17948718]\n", " [0.73076923 0.33333333 0.48717949 0.14102564]\n", " [0.82051282 0.3974359 0.64102564 0.24358974]\n", " [0.6025641 0.37179487 0.16666667 0. ]\n", " [0.69230769 0.43589744 0.15384615 0.01282051]\n", " [0.61538462 0.38461538 0.17948718 0. ]\n", " [0.64102564 0.47435897 0.17948718 0.02564103]\n", " [0.79487179 0.41025641 0.58974359 0.19230769]\n", " [0.82051282 0.37179487 0.73076923 0.26923077]\n", " [0.70512821 0.30769231 0.48717949 0.12820513]\n", " [0.71794872 0.34615385 0.56410256 0.15384615]\n", " [0.80769231 0.34615385 0.70512821 0.26923077]\n", " [0.58974359 0.3974359 0.19230769 0.01282051]\n", " [0.76923077 0.37179487 0.61538462 0.21794872]\n", " [0.62820513 0.42307692 0.19230769 0.03846154]\n", " [0.80769231 0.34615385 0.70512821 0.25641026]\n", " [1. 0.47435897 0.80769231 0.24358974]\n", " [0.84615385 0.37179487 0.65384615 0.28205128]\n", " [0.84615385 0.30769231 0.73076923 0.21794872]\n", " [0.85897436 0.3974359 0.74358974 0.28205128]\n", " [0.6025641 0.37179487 0.16666667 0.02564103]\n", " [0.6025641 0.38461538 0.19230769 0.01282051]\n", " [0.57692308 0.44871795 0.11538462 0.01282051]\n", " [0.71794872 0.55128205 0.17948718 0.03846154]\n", " [0.84615385 0.38461538 0.55128205 0.16666667]\n", " [0.6025641 0.42307692 0.19230769 0.01282051]\n", " [0.55128205 0.3974359 0.15384615 0.01282051]\n", " [0.79487179 0.30769231 0.62820513 0.23076923]\n", " [0.80769231 0.3974359 0.56410256 0.17948718]\n", " [0.65384615 0.43589744 0.17948718 0.01282051]\n", " [0.62820513 0.44871795 0.16666667 0.01282051]\n", " [0.65384615 0.51282051 0.17948718 0. ]\n", " [0.73076923 0.33333333 0.64102564 0.23076923]\n", " [0.75641026 0.42307692 0.56410256 0.19230769]\n", " [0.84615385 0.38461538 0.58974359 0.17948718]\n", " [0.67948718 0.48717949 0.15384615 0.03846154]\n", " [0.67948718 0.46153846 0.17948718 0.01282051]\n", " [0.69230769 0.29487179 0.46153846 0.11538462]\n", " [0.79487179 0.34615385 0.64102564 0.17948718]\n", " [0.80769231 0.38461538 0.69230769 0.21794872]\n", " [0.83333333 0.37179487 0.55128205 0.16666667]\n", " [0.91025641 0.44871795 0.76923077 0.30769231]\n", " [0.71794872 0.35897436 0.52564103 0.15384615]\n", " [0.96153846 0.37179487 0.83333333 0.25641026]\n", " [0.70512821 0.37179487 0.56410256 0.17948718]\n", " [0.64102564 0.43589744 0.16666667 0.01282051]\n", " [0.97435897 0.34615385 0.84615385 0.24358974]\n", " [0.73076923 0.33333333 0.51282051 0.11538462]\n", " [0.65384615 0.42307692 0.16666667 0.01282051]\n", " [0.62820513 0.43589744 0.15384615 0.02564103]\n", " [0.64102564 0.47435897 0.23076923 0.03846154]\n", " [0.62820513 0.24358974 0.43589744 0.11538462]]\n", "['Iris-virginica' 'Iris-setosa' 'Iris-setosa' 'Iris-setosa'\n", " 'Iris-versicolor' 'Iris-setosa' 'Iris-versicolor' 'Iris-virginica'\n", " 'Iris-setosa' 'Iris-versicolor' 'Iris-virginica' 'Iris-setosa'\n", " 'Iris-virginica' 'Iris-virginica' 'Iris-versicolor' 'Iris-versicolor'\n", " 'Iris-virginica' 'Iris-versicolor' 'Iris-setosa' 'Iris-versicolor'\n", " 'Iris-virginica' 'Iris-setosa' 'Iris-setosa' 'Iris-versicolor'\n", " 'Iris-versicolor' 'Iris-setosa' 'Iris-virginica' 'Iris-setosa'\n", " 'Iris-setosa' 'Iris-versicolor' 'Iris-versicolor' 'Iris-virginica'\n", " 'Iris-versicolor' 'Iris-virginica' 'Iris-virginica' 'Iris-versicolor'\n", " 'Iris-setosa' 'Iris-setosa' 'Iris-virginica' 'Iris-virginica'\n", " 'Iris-setosa' 'Iris-setosa' 'Iris-setosa' 'Iris-versicolor'\n", " 'Iris-virginica' 'Iris-setosa' 'Iris-virginica' 'Iris-virginica'\n", " 'Iris-setosa' 'Iris-versicolor' 'Iris-versicolor' 'Iris-virginica'\n", " 'Iris-versicolor' 'Iris-virginica' 'Iris-setosa' 'Iris-virginica'\n", " 'Iris-versicolor' 'Iris-virginica' 'Iris-versicolor' 'Iris-versicolor'\n", " 'Iris-versicolor' 'Iris-setosa' 'Iris-versicolor' 'Iris-versicolor'\n", " 'Iris-setosa' 'Iris-versicolor' 'Iris-virginica' 'Iris-virginica'\n", " 'Iris-setosa' 'Iris-versicolor' 'Iris-virginica' 'Iris-virginica'\n", " 'Iris-setosa' 'Iris-virginica' 'Iris-setosa' 'Iris-versicolor'\n", " 'Iris-virginica' 'Iris-virginica' 'Iris-versicolor' 'Iris-virginica'\n", " 'Iris-versicolor' 'Iris-versicolor' 'Iris-virginica' 'Iris-virginica'\n", " 'Iris-setosa' 'Iris-versicolor' 'Iris-virginica' 'Iris-setosa'\n", " 'Iris-versicolor' 'Iris-virginica']\n", "['Iris-versicolor' 'Iris-setosa' 'Iris-virginica' 'Iris-versicolor'\n", " 'Iris-versicolor' 'Iris-setosa' 'Iris-versicolor' 'Iris-virginica'\n", " 'Iris-versicolor' 'Iris-versicolor' 'Iris-virginica' 'Iris-setosa'\n", " 'Iris-setosa' 'Iris-setosa' 'Iris-setosa' 'Iris-versicolor'\n", " 'Iris-virginica' 'Iris-versicolor' 'Iris-versicolor' 'Iris-virginica'\n", " 'Iris-setosa' 'Iris-virginica' 'Iris-setosa' 'Iris-virginica'\n", " 'Iris-virginica' 'Iris-virginica' 'Iris-virginica' 'Iris-virginica'\n", " 'Iris-setosa' 'Iris-setosa' 'Iris-setosa' 'Iris-setosa' 'Iris-versicolor'\n", " 'Iris-setosa' 'Iris-setosa' 'Iris-virginica' 'Iris-versicolor'\n", " 'Iris-setosa' 'Iris-setosa' 'Iris-setosa' 'Iris-virginica'\n", " 'Iris-versicolor' 'Iris-versicolor' 'Iris-setosa' 'Iris-setosa'\n", " 'Iris-versicolor' 'Iris-virginica' 'Iris-virginica' 'Iris-versicolor'\n", " 'Iris-virginica' 'Iris-versicolor' 'Iris-virginica' 'Iris-versicolor'\n", " 'Iris-setosa' 'Iris-virginica' 'Iris-versicolor' 'Iris-setosa'\n", " 'Iris-setosa' 'Iris-setosa' 'Iris-versicolor']\n" ] } ], "source": [ "print(Dev_norm_data_X)\n", "print(test_norm_data_X)\n", "print(Dev_norm_data_y)\n", "print(test_norm_data_y)" ] }, { "cell_type": "code", "execution_count": 208, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "C:\\Users\\mxm5116\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\model_selection\\_split.py:1978: FutureWarning: The default value of cv will change from 3 to 5 in version 0.22. Specify it explicitly to silence this warning.\n", " warnings.warn(CV_WARNING, FutureWarning)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Best Hyper Parameters:\n", " {'algorithm': 'auto', 'leaf_size': 1, 'n_jobs': -1, 'n_neighbors': 7, 'weights': 'distance'}\n", "Accuracy: 0.9833333333333333\n", "Confusion Metrix:\n", " [[23 0 0]\n", " [ 0 19 1]\n", " [ 0 0 17]]\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "C:\\Users\\mxm5116\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\model_selection\\_search.py:813: DeprecationWarning: The default of the `iid` parameter will change from True to False in version 0.22 and will be removed in 0.24. This will change numeric results when test-set sizes are unequal.\n", " DeprecationWarning)\n" ] } ], "source": [ "# Now lets Run KNN with a range of K value and normalized euclidean distance\n", "from sklearn.model_selection import GridSearchCV\n", "from sklearn.neighbors import KNeighborsClassifier\n", "from sklearn import metrics\n", "\n", "params = {'n_neighbors':[1,3,5,7,9,11,13,15,17,19,21],\n", " 'leaf_size':[1,2,3,5,10,15,20,30],\n", " 'weights':['uniform', 'distance'],\n", " 'algorithm':['auto', 'ball_tree','kd_tree','brute'],\n", " 'n_jobs':[-1]}\n", "Dev_model = KNeighborsClassifier(n_jobs=-1)\n", "KNN_model = GridSearchCV(Dev_model, param_grid=params, n_jobs=1)\n", "KNN_model.fit(Dev_norm_data_X,Dev_norm_data_y)\n", "print(\"Best Hyper Parameters:\\n\",KNN_model.best_params_)\n", "prediction=KNN_model.predict(test_norm_data_X)\n", "print(\"Accuracy:\",metrics.accuracy_score(prediction,test_norm_data_y))\n", "print(\"Confusion Metrix:\\n\",metrics.confusion_matrix(prediction,test_norm_data_y))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# After normalizing the best hyperparameter and accuracy of the algorithm did not change, it is still K=7 and accuracy =98.33, now lets see the step by step in manual" ] }, { "cell_type": "code", "execution_count": 222, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The accuracy of our classifier is 98.33333333333333\n" ] } ], "source": [ "# Now Apply euclidean distance in KNN step by step \n", "def train(Dev_norm_data_X, Dev_norm_data_y):\n", " return\n", "\n", "def predict(Dev_norm_data_X, Dev_norm_data_y, test_norm_data_X, k):\n", " \n", "\n", " distances = []\n", " targets = []\n", "\n", " for i in range(len(Dev_norm_data_X)):\n", " distances.append([np.sqrt(np.sum(np.square(test_norm_data_X - Dev_norm_data_X[i, :]))), i])\n", "\n", " distances = sorted(distances)\n", "\n", " # make a list of the k neighbors' targets\n", " for i in range(k):\n", " index = distances[i][1]\n", " targets.append(Dev_norm_data_y[index])\n", "\n", " # return most common target\n", " return Counter(targets).most_common(1)[0][0]\n", "\n", "\n", "def k_nearest_neighbor(Dev_norm_data_X, Dev_norm_data_y, test_norm_data_X, k):\n", " # train on the develop data\n", " train(Dev_norm_data_X, Dev_norm_data_y)\n", "\n", " # loop over all observations\n", " predictions = []\n", " for i in range(len(test_norm_data_X)):\n", " predictions.append(predict(Dev_norm_data_X, Dev_norm_data_y, test_norm_data_X[i, :], k))\n", "\n", " return np.asarray(predictions)\n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Now check the accuracy for different K values" ] }, { "cell_type": "code", "execution_count": 245, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "accuracy1 98.33333333333333\n", "accuracy3 98.33333333333333\n", "accuracy5 98.33333333333333\n", "accuracy7 98.33333333333333\n", "accuracy9 98.33333333333333\n", "accuracy11 100.0\n", "accuracy13 100.0\n" ] } ], "source": [ "# Now make the predictions, when, k=1\n", "predictions = k_nearest_neighbor(Dev_norm_data_X, Dev_norm_data_y, test_norm_data_X,1)\n", "\n", "# Evaluate accuracy\n", "accuracy = accuracy_score(test_norm_data_y, predictions)\n", "print(\"accuracy1 {}\".format(100*accuracy))\n", "\n", "# Now make the predictions, when, k=3\n", "predictions = k_nearest_neighbor(Dev_norm_data_X, Dev_norm_data_y, test_norm_data_X,3)\n", "\n", "# Evaluate accuracy\n", "accuracy = accuracy_score(test_norm_data_y, predictions)\n", "print(\"accuracy3 {}\".format(100*accuracy))\n", "\n", "# Now make the predictions, when, k=5\n", "predictions = k_nearest_neighbor(Dev_norm_data_X, Dev_norm_data_y, test_norm_data_X,5)\n", "\n", "# Evaluate accuracy\n", "accuracy = accuracy_score(test_norm_data_y, predictions)\n", "print(\"accuracy5 {}\".format(100*accuracy))\n", "\n", "# Now make the predictions, when, k=7\n", "predictions = k_nearest_neighbor(Dev_norm_data_X, Dev_norm_data_y, test_norm_data_X,7)\n", "\n", "# Evaluate accuracy\n", "accuracy = accuracy_score(test_norm_data_y, predictions)\n", "print(\"accuracy7 {}\".format(100*accuracy))\n", "\n", "# Now make the predictions, when, k=9\n", "predictions = k_nearest_neighbor(Dev_norm_data_X, Dev_norm_data_y, test_norm_data_X,9)\n", "\n", "# Evaluate accuracy\n", "accuracy = accuracy_score(test_norm_data_y, predictions)\n", "print(\"accuracy9 {}\".format(100*accuracy))\n", "\n", "# Now make the predictions, when, k=11\n", "predictions = k_nearest_neighbor(Dev_norm_data_X, Dev_norm_data_y, test_norm_data_X,11)\n", "\n", "# Evaluate accuracy\n", "accuracy = accuracy_score(test_norm_data_y, predictions)\n", "print(\"accuracy11 {}\".format(100*accuracy))\n", "\n", "\n", "# Now make the predictions, when, k=13\n", "predictions = k_nearest_neighbor(Dev_norm_data_X, Dev_norm_data_y, test_norm_data_X,13)\n", "\n", "# Evaluate accuracy\n", "accuracy = accuracy_score(test_norm_data_y, predictions)\n", "print(\"accuracy13 {}\".format(100*accuracy))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# So, after normalizing our result does not change than euclidean" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Now lets apply the cosine similarity" ] }, { "cell_type": "code", "execution_count": 122, "metadata": {}, "outputs": [], "source": [ "def load_dataset(data, split):\n", " training_set = []\n", " test_set = []\n", " with open(data, 'r') as csvfile:\n", " lines = csv.reader(csvfile)\n", " dataset = list(lines)\n", " for x in range(len(dataset)):\n", " for y in range(4):\n", " dataset[x][y] = float(dataset[x][y])\n", " if random.random() < split:\n", " training_set.append(dataset[x])\n", " else:\n", " test_set.append(dataset[x])\n", "\n", " return training_set, test_set" ] }, { "cell_type": "code", "execution_count": 117, "metadata": {}, "outputs": [], "source": [ "def cosine_distance(instance1, instance2):\n", " p1 = instance1[:-1]\n", " p2 = instance2[:-1]\n", " return cosine(p1, p2)\n" ] }, { "cell_type": "code", "execution_count": 124, "metadata": {}, "outputs": [], "source": [ "def get_neighbors(training_set, test_instance, k):\n", " distances = []\n", " length = len(test_instance) \n", " for x in range(len(training_set)):\n", " dist = cosine_distance(test_instance, training_set[x])\n", " distances.append((training_set[x], dist))\n", " distances.sort(key=operator.itemgetter(1))\n", " \n", " for x in range(k):\n", " neighbors = []\n", " neighbors.append(distances[x][0])\n", " return neighbors" ] }, { "cell_type": "code", "execution_count": 125, "metadata": {}, "outputs": [], "source": [ "def get_response(neighbors):\n", " \n", " class_votes = {}\n", " for x in range(len(neighbors)):\n", " response = neighbors[x][-1]\n", " class_votes[response] = 1\n", " sorted_votes = sorted(class_votes.items(), key=operator.itemgetter(1), reverse=True)\n", " return sorted_votes[0][0]" ] }, { "cell_type": "code", "execution_count": 128, "metadata": {}, "outputs": [], "source": [ "def get_accuracy(test_set, predictions):\n", " correct = 0\n", " for x in range(len(test_set)):\n", " if test_set[x][-1] == predictions[x]:\n", " correct += 1\n", " return (correct / float(len(test_set))) * 100.0" ] }, { "cell_type": "code", "execution_count": 227, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Train set: 90\n", "Test set: 60\n", "> predicted='Iris-setosa', actual='Iris-setosa'\n", "> predicted='Iris-setosa', actual='Iris-setosa'\n", "> predicted='Iris-setosa', actual='Iris-setosa'\n", "> predicted='Iris-setosa', actual='Iris-setosa'\n", "> predicted='Iris-setosa', actual='Iris-setosa'\n", "> predicted='Iris-setosa', actual='Iris-setosa'\n", "> predicted='Iris-setosa', actual='Iris-setosa'\n", "> predicted='Iris-setosa', actual='Iris-setosa'\n", "> predicted='Iris-setosa', actual='Iris-setosa'\n", "> predicted='Iris-setosa', actual='Iris-setosa'\n", "> predicted='Iris-setosa', actual='Iris-setosa'\n", "> predicted='Iris-setosa', actual='Iris-setosa'\n", "> predicted='Iris-setosa', actual='Iris-setosa'\n", "> predicted='Iris-setosa', actual='Iris-setosa'\n", "> predicted='Iris-setosa', actual='Iris-setosa'\n", "> predicted='Iris-setosa', actual='Iris-setosa'\n", "> predicted='Iris-versicolor', actual='Iris-versicolor'\n", "> predicted='Iris-versicolor', actual='Iris-versicolor'\n", "> predicted='Iris-versicolor', actual='Iris-versicolor'\n", "> predicted='Iris-virginica', actual='Iris-versicolor'\n", "> predicted='Iris-versicolor', actual='Iris-versicolor'\n", "> predicted='Iris-virginica', actual='Iris-versicolor'\n", "> predicted='Iris-versicolor', actual='Iris-versicolor'\n", "> predicted='Iris-versicolor', actual='Iris-versicolor'\n", "> predicted='Iris-versicolor', actual='Iris-versicolor'\n", "> predicted='Iris-versicolor', actual='Iris-versicolor'\n", "> predicted='Iris-versicolor', actual='Iris-versicolor'\n", "> predicted='Iris-virginica', actual='Iris-versicolor'\n", "> predicted='Iris-versicolor', actual='Iris-versicolor'\n", "> predicted='Iris-virginica', actual='Iris-versicolor'\n", "> predicted='Iris-virginica', actual='Iris-versicolor'\n", "> predicted='Iris-versicolor', actual='Iris-versicolor'\n", "> predicted='Iris-versicolor', actual='Iris-versicolor'\n", "> predicted='Iris-versicolor', actual='Iris-versicolor'\n", "> predicted='Iris-versicolor', actual='Iris-versicolor'\n", "> predicted='Iris-versicolor', actual='Iris-versicolor'\n", "> predicted='Iris-versicolor', actual='Iris-versicolor'\n", "> predicted='Iris-virginica', actual='Iris-virginica'\n", "> predicted='Iris-virginica', actual='Iris-virginica'\n", "> predicted='Iris-virginica', actual='Iris-virginica'\n", "> predicted='Iris-virginica', actual='Iris-virginica'\n", "> predicted='Iris-virginica', actual='Iris-virginica'\n", "> predicted='Iris-virginica', actual='Iris-virginica'\n", "> predicted='Iris-virginica', actual='Iris-virginica'\n", "> predicted='Iris-virginica', actual='Iris-virginica'\n", "> predicted='Iris-virginica', actual='Iris-virginica'\n", "> predicted='Iris-virginica', actual='Iris-virginica'\n", "> predicted='Iris-virginica', actual='Iris-virginica'\n", "> predicted='Iris-virginica', actual='Iris-virginica'\n", "> predicted='Iris-virginica', actual='Iris-virginica'\n", "> predicted='Iris-virginica', actual='Iris-virginica'\n", "> predicted='Iris-virginica', actual='Iris-virginica'\n", "> predicted='Iris-virginica', actual='Iris-virginica'\n", "> predicted='Iris-virginica', actual='Iris-virginica'\n", "> predicted='Iris-virginica', actual='Iris-virginica'\n", "> predicted='Iris-virginica', actual='Iris-virginica'\n", "> predicted='Iris-virginica', actual='Iris-virginica'\n", "> predicted='Iris-virginica', actual='Iris-virginica'\n", "> predicted='Iris-virginica', actual='Iris-virginica'\n", "> predicted='Iris-virginica', actual='Iris-virginica'\n", "Accuracy: 91.66666666666666%\n" ] } ], "source": [ "# prepare data\n", "\n", "split = 0.60\n", "training_set, test_set = load_dataset('iris1.csv', split)\n", "print('Train set: ' + repr(len(training_set)))\n", "print('Test set: ' + repr(len(test_set)))\n", "predictions = [] \n", "for x in range(len(test_set)):\n", " neighbors = get_neighbors(training_set, test_set[x], 7)\n", " result = get_response(neighbors)\n", " predictions.append(result)\n", " print('> predicted=' + repr(result) + ', actual=' + repr(test_set[x][-1]))\n", "accuracy = get_accuracy(test_set, predictions)\n", "print('Accuracy: ' + repr(accuracy) + '%')" ] }, { "cell_type": "code", "execution_count": 236, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAzUAAAGxCAYAAABbUpgLAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nOzdeZyNdf/H8fcx+4wxzGDGWGYmWTOWFmsxliEZohDurG1SiRRKmEGEbincJHtIyw9JWcZed7pRUqTFnRDGMDRkn5nv748e57qd2YfhdOX1fDzO4zHzvZbv59qvz7m+1/c4jDFGAAAAAGBTRdwdAAAAAABcC5IaAAAAALZGUgMAAADA1khqAAAAANgaSQ0AAAAAWyOpAQAAAGBrJDUAAAAAbI2kBgAAAICtkdQAAAAAsLUCJTXz5s2Tw+GwPp6enipXrpx69+6tw4cPF3pwO3fuVJMmTRQUFCSHw6HJkycXeh3I3pQpU3TrrbfK29tbDodDv//+e4Gmj4+Pl8PhcCmLjIxUr169XMpy2sbr16/XnXfeqYCAADkcDi1fvvyalud6+vTTTxUfH5/v8Xv16uVyHAUEBCgyMlLt2rXT3LlzdfHixSzTxMTEKCYmpkBxff/994qPj9evv/5aoOn+qjZt2mSts3nz5mU7TrNmzeRwOBQZGXlVdSxevLjA55lff/0115huBOe5+cptndOyOON97bXXrqmuHTt2XG24V6Wg2yYmJkY1atTIdtiJEyfkcDgKdNzCPY4cOaL4+Hh98803N6zOaz1G8pL5GpD58+WXX+Y6fXbX12vlcDj09NNPZykfOXKkHA6HnnzySWVkZFjrxuFwaMmSJTnGduLECavMuby33Xab0tPT8113ZidPnlSXLl1UunRpORwOtW/fvoBLWTC5nUOyU1jnlCuvdQ6HQ97e3ipVqpQaNWqkYcOG6cCBA1c9b3ccTwV17tw5xcfHa9OmTQWe1vNqKpw7d66qVq2q8+fPa8uWLRo3bpw2b96s7777TgEBAVczy2z16dNHZ8+e1ZIlS1SiRImrvlFBwXzzzTfq37+/Hn30UfXs2VOenp4KDAy85vkuW7ZMxYoVcynLbhsbY9S5c2dVrlxZK1asUEBAgKpUqXLN9V8vn376qaZNm1agk5mfn582bNggSTp//rwOHTqkVatW6bHHHtM///lPrV69WuXKlbPG/9e//lXguL7//nslJCQoJibmb3XsBAYGavbs2VkS5P3792vTpk1Z9rGCWLx4sXbv3q0BAwbke5oyZcpo69atqlix4lXXe63atGmjrVu3qkyZMlbZ1SzLX9nfbXmQP0eOHFFCQoIiIyNVu3Ztd4dTKIYPH66+fftmKW/btq18fHx011135Tr9o48+qnvvvfd6hSdJMsbo2Wef1ZQpUzR06FCNGzcuyzjDhg3Tgw8+KC8vr3zN8/vvv9e8efP0yCOPXFVMo0eP1rJlyzRnzhxVrFhRwcHBVzWf62Xr1q0u1+1rNXbsWDVt2lTp6elKSUnRf/7zH82ZM0evv/663n77bf3jH/8o8DztcDydO3dOCQkJklTgL3OvKqmpUaOG7rzzTkmyVvjo0aO1fPnyq1rJV0pPT1daWpp8fHy0e/duPfbYY2rduvU1zdPp8uXL1hMm5GzPnj2SpMcee0x169YttPnWqVMnS1l22/jw4cM6efKkOnTooObNmxdK3X+1bV+kSBHVr1/fpaxHjx7q3bu34uLi1LFjR5dv66pXr36jQ/zLeuihhzRr1iz9/PPPqlSpklU+Z84clS1bVtHR0fr++++vexxXnqsyb8sbrVSpUipVqpRbY0DhOnfunPz9/W9YfefPn5efn98Nq8/dzp8/L19f30J/4pEfFStWzPIlyObNm3XixAm9/PLL8vDwyHX6cuXKFerNc2ZpaWnq06eP3nnnHU2cOFHPP/98lnFat26tVatWacaMGXrmmWfynGdAQIBuv/12jRw5Ut26dbuqfW337t2qWLHiNd9nOhljdOHChWva76+cR2FfBypVquQyz3bt2mnQoEFq0aKFevXqpZo1ayo6OrpQ67S7QnmnxrnSr3wklpSUpCeeeELlypWTt7e3oqKilJCQoLS0NGsc52PMCRMmaMyYMYqKipKPj4/mzp0rh8OhtLQ0TZ8+3XoE57R7927df//9KlGihHx9fVW7dm3Nnz/fJSbn47t33nlHgwYNUtmyZeXj46N9+/ZZzSc2bNigxx57TCEhISpWrJh69Oihs2fPKikpSZ07d1bx4sVVpkwZPf/887p8+bLL/BMSElSvXj0FBwerWLFiuv322zV79mwZY1zGi4yMVFxcnFavXq3bb79dfn5+qlq1qubMmZNlPR4+fFiPP/64ypcvL29vb4WHh6tjx446duyYNc7p06f1/PPPKyoqSt7e3ipbtqwGDBigs2fP5mtbzZkzR7Vq1ZKvr6+Cg4PVoUMH7d271xoeExOjhx9+WJJUr149ORyOLN+IZ/bJJ5+odu3a8vHxUVRUVI6P7K9sfubcBpm3cXx8vHWyHjJkSJamRD///LO6deum0qVLy8fHR9WqVdO0adNc6slt20sF2zdfe+01TZo0SVFRUSpatKgaNGjgkmz06tXLqv/Kx8VX2+SrZcuWeuyxx/Sf//xHW7Zsscqza342ffp01apVS0WLFlVgYKCqVq2ql156yVq/nTp1kvTnFw+Zm20lJibq/vvvV7ly5eTr66tbb71VTzzxhEuTAel/TQn27Nmjrl27KigoSKGhoerTp49SU1Ndxs3IyNCUKVNUu3Zt+fn5qXjx4qpfv75WrFjhMt57772nBg0aKCAgQEWLFlWrVq20c+fOfK+j2NhYlS9f3uUYysjI0Pz589WzZ08VKZL1tGaM0b/+9S8rthIlSqhjx4765ZdfXNbxJ598ogMHDrhsSynnc9XGjRtzbH72ww8/qGvXrgoNDZWPj48qVKigHj16ZNu80Omuu+5SmzZtXMqio6PlcDi0fft2q2zp0qVyOBz67rvvJGVtfpbbslwpt307L6dOnVLv3r0VHBysgIAAtW3b1mV9Oq1bt07NmzdXsWLF5O/vr0aNGmn9+vUu4xw/ftw69/n4+FhNLdatW1eg5blav/76qzw9PbP9NnrLli1yOBz64IMPJP3vmNi5c6ceeOABFStWTEFBQXr44Yd1/PjxLNPnZ3/v1auXihYtqu+++04tW7ZUYGCg9YWOswnMZ599pvr168vPz09ly5bV8OHDszTlKeh1aenSpapTp458fX2tb0anTZumxo0bq3Tp0goICFB0dLQmTJiQ5RrojGvr1q1q2LCh/Pz8FBkZqblz50r687pw++23y9/fX9HR0Vq9enWWdZPX+XzTpk3WU4vevXu7XCecduzYoXbt2ik4OFi+vr6qU6eO3n//fZd6nMfH2rVr1adPH5UqVUr+/v65HouZXb58WT179lTRokW1cuXKfE+XX7Nnz5bD4VCfPn3yHDen5t35vdfIzYULF/Tggw9q8eLFmjVrVrYJjfRnU99WrVpp9OjROnPmTL7mPX78eB0+fFhvvPFGgWJynmPXrVunvXv3WvuBs3nSyZMn1a9fP5UtW1be3t665ZZbNGzYsCzb19nMbcaMGapWrZp8fHyy3DvmJbd5ZN43z507Z92vOe+57rzzTr377rsFqvNKwcHBeuutt5SWlqbXX3/dKt+3b5969+6tSpUqyd/fX2XLllXbtm2ta4SU9/G0Y8cOdenSRZGRkdbx3LVr13w3d8vtnsQpr/uvX3/91fqCLiEhwYoxr/tQiymAuXPnGklm+/btLuVvvPGGkWRmzpxpjDHm6NGjpnz58iYiIsK89dZbZt26dWb06NHGx8fH9OrVy5pu//79RpIpW7asadq0qfnwww/N2rVrzbZt28zWrVuNJNOxY0ezdetWs3XrVmOMMT/88IMJDAw0FStWNAsWLDCffPKJ6dq1q5Fkxo8fb81748aN1rw7duxoVqxYYVauXGlSUlKs5YiKijKDBg0ya9euNePHjzceHh6ma9eu5vbbbzdjxowxiYmJZsiQIUaS+ec//+myzL169TKzZ882iYmJJjEx0YwePdr4+fmZhIQEl/EiIiJMuXLlTPXq1c2CBQvMmjVrTKdOnYwks3nzZmu83377zZQpU8aULFnSTJo0yaxbt8689957pk+fPmbv3r3GGGPOnj1rateu7TLOG2+8YYKCgkyzZs1MRkZGrttv7NixRpLp2rWr+eSTT8yCBQvMLbfcYoKCgsxPP/1kjDFmz5495uWXXzaSzNy5c83WrVvNvn37cpznunXrjIeHh7n77rvN0qVLzQcffGDuuusuU6FCBZN594qIiDA9e/Y0xhiTnJyc7TY+dOiQWbp0qZFknnnmGbN161bz9ddfW7EFBQWZ6Ohos2DBArN27VozaNAgU6RIERMfH5+vbV/QfTMyMtLce++9Zvny5Wb58uUmOjralChRwvz+++/GGGP27dtnOnbsaCRZy7B161Zz4cKFHNdZz549TUBAQI7DV69ebSSZ0aNHW2VNmjQxTZo0sf5/9913rXW0du1as27dOjNjxgzTv39/a/06t/e0adOsuJKTk40xxkyfPt2MGzfOrFixwmzevNnMnz/f1KpVy1SpUsVcunTJqmfkyJFGkqlSpYoZMWKESUxMNJMmTTI+Pj6md+/eLnF3797dOBwO8+ijj5qPPvrIrFq1yrzyyivmjTfesMZ55ZVXjMPhMH369DErV640S5cuNQ0aNDABAQFmz549Oa4TY/63XT/44AMzfPhwEx4ebtLS0owxxqxatco4HA6zb98+06ZNGxMREeEy7WOPPWa8vLzMoEGDzOrVq83ixYtN1apVTWhoqElKSjLG/Ll/NWrUyISFhblsS2NyPlft37/fGjZ37lyrvm+++cYULVrUREZGmhkzZpj169ebhQsXms6dO5vTp0/nuIxDhw41RYsWtbZBUlKSkWT8/PzMK6+8Yo335JNPmtDQUOt/5zlt//79+V6WvPbtnDjrKl++vOnTp49ZtWqVmTlzpildurQpX768OXXqlDXuO++8YxwOh2nfvr1ZunSp+fjjj01cXJzx8PAw69ats8Zr1aqVKVWqlJk5c6bZtGmTWb58uRkxYoRZsmRJnsuTkyZNmpjbbrvNXL58OcvHuV5Hjhxpjd+hQwdToUIFa59y6tSpkwkPDzeXL182xvzvmIiIiDAvvPCCWbNmjZk0aZIJCAgwderUcTl+8ru/9+zZ03h5eZnIyEgzbtw4s379erNmzRprOUJCQkx4eLh58803zZo1a0z//v2NJPPUU0+5xFqQ61KZMmXMLbfcYubMmWM2btxotm3bZowxZuDAgWb69Olm9erVZsOGDeb11183JUuWzHK8O+OqUqWKmT17tlmzZo2Ji4szkkxCQoKJjo427777rvn0009N/fr1jY+Pjzl8+LA1fX7O56mpqdb+9vLLL7tcJ4wxZsOGDcbb29vcc8895r333jOrV682vXr1ynI8OudRtmxZ8/jjj5tVq1aZDz/8MMu2dnIeIxMnTjTGGHPq1CnTtGlTExYWZnbs2OEybnb7V3af3K7Pv//+u/Hz8zMtWrTIcZwrOffBK+X3XiMnkkyPHj1MTEyM8fb2Nh9++GG24125br755hvjcDjM8OHDs8R2/Phxq+zKa16HDh1M8eLFTUpKikvdmfflK124cMFs3brV1KlTx9xyyy3WfpCammrOnz9vatasaQICAsxrr71m1q5da4YPH248PT3Nfffdl2UZy5Yta2rWrGkWL15sNmzYYHbv3p1jvc5zSH7nkfmc8sQTTxh/f38zadIks3HjRrNy5Urz6quvmilTpuRYpzGu17qclClTxlSsWNH6f/PmzWbQoEHmww8/NJs3bzbLli0z7du3N35+fuaHH34wxuR9PH3wwQdmxIgRZtmyZWbz5s1myZIlpkmTJqZUqVIu2zM7ed2TGJO/3ODChQvWPdAjjzxixZjbfeiVriqp+fLLL83ly5fNmTNnzMqVK02pUqVMYGCgdXPwxBNPmKJFi5oDBw64TP/aa68ZSdbJ3HlwVKxY0eVCYAWXzY7epUsX4+PjYw4ePOhS3rp1a+Pv729dkJ07RePGjXNcjmeeecalvH379kaSmTRpkkt57dq1ze23357jeklPTzeXL182o0aNMiEhIS4nr4iICOPr6+uyLs6fP2+Cg4PNE088YZX16dPHeHl5me+//z7HesaNG2eKFCmSJan88MMPjSTz6aef5jjtqVOnjJ+fX5aD/ODBg8bHx8d069bNKsspec1OvXr1THh4uDl//rxVdvr0aRMcHJxrUuOU3TbOfEFxatWqlSlXrpxJTU11KX/66aeNr6+vOXnypDEm921f0H0zOjra5cK3bds2I8m8++67VtlTTz2VZVlzk1dSs3fvXiPJPPnkk1ZZ5qTm6aefNsWLF8+1ng8++MBIMhs3bsx1vIyMDHP58mVz4MABI8l89NFH1jDnBWrChAku0/Tr18/4+vpa+/qWLVuMJDNs2LAc6zl48KDx9PTMctydOXPGhIWFmc6dO+ca55Un+l9++cU4HA6zcuVKY8yfN54xMTHGGJMlqXEmz5m/mDh06JDx8/MzgwcPtsqyS4iMyf1clV1S06xZM1O8eHEricyvdevWGUlmy5YtxhhjFi5caAIDA02/fv1M06ZNrfEqVaqU7THrTGrysyz52bez46yrQ4cOLuX//ve/jSQzZswYY8yfX8IEBwebtm3buoyXnp5uatWqZerWrWuVFS1a1AwYMCDXenNanpw0adLESMr1c+UNiHP/WrZsmVV2+PBh4+np6ZIUOI+JgQMHutS3aNEiI8ksXLjQGFOw/b1nz55GkpkzZ06Oy3HlcWnMn4l6kSJFspzLnPK6Lnl4eJgff/wxp9XnMo8FCxYYDw8P6xx7ZVxX3uSnpKQYDw8P4+fn55LAfPPNN0aSefPNN62y/J7Pt2/fnuX4cqpataqpU6eOlXA6xcXFmTJlypj09HRjzP/22R49euS6vE5XXoP2799vqlevbqpXr25+/fXXbMfLzye38/D06dPzdew55ZTU5OdeIydXxur8gjo7ma/P//jHP0xAQIA5evSoS2w5JTU//PCD8fDwMIMGDXKpO7ekxim7JGPGjBlGknn//fddysePH28kmbVr17rUExQU5LIfF7S+3OaR+ZxSo0YN0759+3zVdaX8JDX16tUzfn5+OQ5PS0szly5dMpUqVXI5V+V2PGU3jz/++MMEBAS4fDmZnfzck+T3/uv48eNZ1mV+XVXzs/r168vLy0uBgYGKi4tTWFiYVq1apdDQUEnSypUr1bRpU4WHhystLc36ON+b2Lx5s8v82rVrl+8XzTZs2KDmzZurfPnyLuW9evXSuXPntHXrVpfyBx98MMd5xcXFufxfrVo1ScrS/KNatWpZHr9t2LBBLVq0UFBQkDw8POTl5aURI0YoJSVFycnJLuPWrl1bFSpUsP739fVV5cqVXea5atUqNW3a1IohOytXrlSNGjVUu3Ztl/XaqlUrl0ex2dm6davOnz+f5RFe+fLl1axZsyzNQfLj7Nmz2r59ux544AH5+vpa5YGBgWrbtm2B55ebCxcuaP369erQoYP8/f1dlv++++7ThQsXsjSdyW7bF3TfbNOmjUv75po1a0rSNfU+kheTqalIdurWravff/9dXbt21UcffZSl2VhekpOT1bdvX5UvX16enp7y8vJSRESEJLk0R3Rq166dy/81a9bUhQsXrH191apVkqSnnnoqxzrXrFmjtLQ09ejRw2Xd+/r6qkmTJgXq6SQqKkoxMTGaM2eOUlJS9NFHH+XYbGPlypVyOBx6+OGHXeoNCwtTrVq1ClRvfs5V586d0+bNm9W5c+cCv+fSqFEj+fr6Ws2uEhMTFRMTo3vvvVdffPGFzp07p0OHDunnn39WixYtCjTvzK51387crr1hw4aKiIjQxo0bJUlffPGFTp48qZ49e7qs94yMDN17773avn271Wy2bt26mjdvnsaMGaMvv/wyS1Onq1WxYkVt3749y8e5fq8UExOjWrVquTR/mjFjhhwOhx5//PE8l79z587y9PS0lv9q9vecrleBgYFZjsFu3bopIyPDpZlqQa5LNWvWVOXKlbPUtXPnTrVr104hISHWPHr06KH09HT99NNPLuOWKVNGd9xxh/V/cHCwSpcurdq1ays8PNwqd17XnPvW1ZzPM9u3b59++OEHaztknsfRo0f1448/ukyT2/1Adr7++mvVr19foaGh+ve//22dI53Cw8Oz3b+y+1y5njKbPXu2QkJC1KFDhwLFl1l+7jVyc88996h48eJKSEiwmmvnZcyYMbp8+bLVfDEv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0iW1b99ee/bsUURERI7fvDtPyJlv5t96662rjrt169YaN26cpk+frlGjRmU7TqtWreTp6an//ve/BW4Gkh0/Pz+NGDFCW7Zs0ZNPPpnjeHFxcXr11Vd1+PBhde7cOdd5FuRbzdziatKkiT744AO98sorBf7CoEWLFnrppZc0fPhwlStXTlWrVrXKV6xYoaSkpHytv8JYltwsWrTIJY4vvvhCBw4csG7OGjVqpOLFi+v777/P1w/rOVWoUEFPP/201q9fr3//+99W+fVeHunPJzuPP/64pk6dqi+++EK1a9dWo0aNsh130aJFLk2K3o0jWJcAACAASURBVH//faWlpVk3roW5v585c0YrVqxwaYK2ePFiFSlSRI0bN5ZUONel7M4Nxhi9/fbb1xR/ZgU5n+d0HqtSpYoqVaqkXbt2ZbmRKyxFihTRzJkzFRgYqF69euns2bMu5xpn87P8yO66fvHiRS1cuFB169Yt0I88Xm+333671q9frxYtWliJjfM8lJ2QkBANGTJEw4YNy3dPrEOGDNHMmTNdbqCvRvPmzfX+++9r+fLlLs33FixYYA3/KwgNDVWvXr20a9cuTZ48+aq7bD958qT69u0rLy8vDRw40Cp3OBxZrumffPKJDh8+bH3RJOV8PDkcDhljssxj1qxZ2f5gam5yuifJ7/3XtbSIuS5JzahRo5SYmKiGDRuqf//+qlKlii5cuKBff/1Vn376qWbMmHHVfayPHDnSapc3YsQIBQcHa9GiRfrkk080YcIEBQUFFfLSZNWmTRtNmjRJ3bp10+OPP66UlBS99tpr1/ToeNSoUVq1apUaN26sl156SdHR0fr999+1evVqPffcc6pataoGDBig//u//1Pjxo01cOBA1axZUxkZGTp48KDWrl2rQYMGqV69etnOv3jx4ho+fLheeukl9ejRQ127dlVKSooSEhLk6+urkSNHXlXco0eP1r333qvY2FgNGjRI6enpGj9+vAICAvKd3efXG2+8obvvvlv33HOPnnzySUVGRurMmTPat2+fPv74Y+vHLHNzPfZNZz/x48ePV+vWreXh4ZHnhTojI8NqM37x4kUdPHhQq1at0vvvv69q1apl6ZI0M+eTiUaNGqlMmTJKSkrSuHHjFBQUZDV3cV4knRdlX19fRUVFqWrVqqpYsaKGDh0qY4yCg4P18ccfX1UTRKd7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1W6MDAAAALhxPN0dAK7e2rVrtWbNGpUrV86lvFKlSjpw4ICbogIAAABuLJ7U2NjZs2ddntA4nThxQj4+Pm6ICAAAALjxSGpsrHHjxlqwYIH1v8PhUEZGhiZOnKimTZu6MTIAAADgxqH5mY1NnDhRMTEx2rFjhy5duqTBgwdrz549OnnypP7973+7OzwAAADghuBJjY1Vr15d3377rerWravY2FidPXtWDzzwgHbu3KmKFSsWal2HDx/Www8/rJCQEPn7+6t27dr66quvrOHGGMXHxys8PFx+fn6KiYnRnj17CjUGAAAAIDs8qbG5sLAwJSQkXNc6Tp06pUaNGqlp06ZatWqVSpcurf/+978qXry4Nc6ECRM0adIkzZs3T5UrV9aYMWMUGxurH3/8UYGBgdc1PgAAANzcSGpsbO7cuSpatKg6derkUv7BBx/o3Llz6tmzZ6HUM378eJUvX15z5861yiIjI62/jTGaPHmyhg0bpgceeECSNH/+fIWGhmrx4sV64oknsszz4sWLunjxovX/6dOnCyVWAAAA3HxofmZjr776qkqWLJmlvHTp0ho7dmyh1bNixQrdeeed6tSpk0qXLq06dero7bfftobv379fSUlJatmypVXm4+OjJk2a6Isvvsh2nuPGjVNQUJD1KV++fKHFCwAAgJsLSY2NHThwQFFRUVnKIyIidPDgwUKr55dfftH06dNVqVIlrVmzRn379lX//v2tnteSkpIkSaGhoS7ThYaGWsMye/HFF5Wammp9Dh06VGjxAgAA4OZC8zMbK126tL799luXpmCStGvXLoWEhBRaPRkZGbrzzjutpz916tTRnj17NH36dPXo0cMaz+FwuExnjMlS5uTj48Nv6QAAAKBQ8KTGxrp06aL+/ftr48aNSk9PV3p6ujZs2KBnn31WXbp0KbR6ypQpo+rVq7uUVatWzXoaFBYWJklZnsokJydneXoDAAAAFDaSGhsbM2aM6tWrp+bNm8vPz09+fn5q2bKlmjVrVqjv1DRq1Eg//vijS9lPP/2kiIgISVJUVJTCwsKUmJhoDb906ZI2b96shg0bFlocAAAAQHZofmZj3t7eeu+99zR69Gjt2rVLfn5+io6OtpKNwjJw4EA1bNhQY8eOVefOnbVt2zbNnDlTM2fOlPRns7MBAwZo7NixqlSpkipVqqSxY8fK399f3bp1K9RYAAAAgMxIav4GKleurMqVK1+3+d91111atmyZXnzxRY0aNUpRUVGaPHmy/vGPf1jjDB48WOfPn1e/fv106tQp1atXT2vXruU3agAAAHDdkdTYWHp6uubNm6f169crOTlZGRkZLsM3bNhQaHXFxcUpLi4ux+EOh0Px8fGKj48vtDoBAACA/CCpsbFnn31W8+bNU5s2bVSjRo0cexoDAAAA/s5IamxsyZIlev/993Xfffe5OxQAAADAbej9zMa8vb116623ujsMAAAAwK1Iamxs0KBBeuONN2SMcXcoAAAAgNvQ/MzGPv/8c23cuFGrVq3SbbfdJi8vL5fhS5cudVNkAAAAwI1DUmNjxYsXV4cOHdwdBgAAAOBWJDU2NnfuXHeHAAAAALgd79QAAAAAsDWe1Njchx9+qPfff18HDx7UpUuXXIZ9/fXXbooKAAAAuHF4UmNjb775pnr37q3SpUtr586dqlu3rkJCQvTLL7+odevW7g4PAAAAuCFIamzsX//6l2bOnKmpU6fK29tbgwcPVmJiovr376/U1FR3hwcAAADcECQ1Nnbw4EE1bNhQkuTn56czZ85Ikrp37653333XnaEBAAAANwxJjY2FhYUpJSVFkhQREaEvv/xSkrR//35+kBMAAAA3DZIaG2vWrJk+/vhjSdIjjzyigQMHKjY2Vg899BC/XwMAAICbBr2f2djMmTOVkZEhSerbt6+Cg4P1+eefq23bturbt6+bowMAAABuDJIaGytSpIiKFPnfw7bOnTurc+fObowIAAAAuPFIamzuwoUL+vbbb5WcnGw9tXFq166dm6ICAAAAbhySGhtbvXq1evTooRMnTmQZ5nA4lJ6e7oaoAAAAgBuLjgJs7Omnn1anTp109OhRZWRkuHxIaAAAAHCzIKmxseTkZD333HMKDQ11dygAAACA25DU2FjHjh21adMmd4cBAAAAuBXv1NjY1KlT1alTJ3322WeKjo6Wl5eXy/D+/fu7KTIAAADgxiGpsbHFixdrzZo18vPz06ZNm+RwOKxhDoeDpAYAAAA3BZIaG3v55Zc1atQoDR061OX3agAAAICbCXfCNnbp0iU99NBDJDQAAAC4qXE3bGM9e/bUe++95+4wAAAAALei+ZmNpaena8KECVqzZo1q1qyZpaOASZMmuSkyAAAA4MYhqbGx7777TnXq1JEk7d69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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Lets draw the final accuracy bar chart for different distance metric with best k=7\n", "objects=('Euclidean','Normalized Euclidean','Cosine')\n", "y_pos = np.arange(len(objects))\n", "performance = [98.33,98.33,91.66]\n", "plt.bar(y_pos, performance, align='center', alpha=0.5,color='red')\n", "plt.xticks(y_pos, objects)\n", "plt.ylabel('Performance')\n", "plt.title('Performance of different Distance Metric with best Hyperparameter,k=7 in KNN for Iris Data set')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Final comment: I found that for the iris data, best hyperparameter(k) is 7 and Euclidean distance metric performs better (98.33%) than Cosine distance(91.67%). There is no difference in performance for Euclidean and Normalized Euclidean in KNN." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "References:\n", " 01. https://www.kaggle.com/mayu0116/hyper-parameters-tuning-of-dtree-rf-svm-knn\n", " 02. https://kevinzakka.github.io/2016/07/13/k-nearest-neighbor/\n", " 03. https://github.com/dtroupe18/SimpleKNN/blob/master/knn.py\n", " " ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.3" } }, "nbformat": 4, "nbformat_minor": 2 }